Cyklus, string a zapisovanie do subora pls rada – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Cyklus, string a zapisovanie do subora pls rada – C / C++ – Fórum – Programujte.comCyklus, string a zapisovanie do subora pls rada – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
SoftOrig
~ Anonymní uživatel
11 příspěvků
19. 7. 2012   #1
-
0
-

#1 Patrik
Zdravím, :)

Rozhodol som sa urobit velmi lahku konzolovu hru kde bude clovek hadat slovo..
V game manu moze zvolit moznost pridat slovo a tu je problem..
Chcel by som aby sa vsetky slova co napise, zapisali do premennej typu string a tie nasledne boli zapisane do subora.
Som zaciatocnik preto prosim o pomoc skusenejsich.

/////////////////////////////////////////////////////
for (int x = 0;x < numofWords;x++) // Uzivatel si zada pocet slov ktore chce zadat.. pozn.Trocha neprakticke ja viem.
  {
   cin >> newWords; // Tu som si niesom isty ci moze byt Char alebo string ale obydvoje funguju no problem je v tom
                              // ze ked mam string a zapisem slovo, dalsie slova sa neuchovaju v premennej newWords ale iba                posledne slovo

  };
  ofstream write;
write.open("D:/RandomText.txt",ios::out);
if (write.fail())
{ cout << "Subor sa nepodarilo otvorit\n";
}
else{
  write << newWords << endl; // Zapis do subora, tu by som chcel dat cyklus, ktory by hned aj zapisoval slova za  //sebou do riadku lenze string a char mi to nedovolia ako to mam urobit ?

  write << newWords << endl;
  write << newWords << endl;
  write << newWords << endl;
  write.close();
}
//////////////////////////////

Snad je to vsetko zrozumitelne napisane..
Ďakujem za pomoc :)

Nahlásit jako SPAM
IP: 178.40.119.–
Reklama
Reklama
yaqwsx+9
Posthunter
19. 7. 2012   #2
-
+1
-
Zajímavé

in >> newWords; // Tu som si niesom isty ci moze byt Char alebo string ale obydvoje funguju no problem je v tom
                              // ze ked mam string a zapisem slovo, dalsie slova sa neuchovaju v premennej newWords ale iba                posledne slovo

Použij string. Poslední slovo se ti uchovává proto, že in >> newWords smaže obsah stringu a načte do něj nové slovo. Nefunguje to analogicky jako u výstupního proudu (cout), kdy se data odeslaná pomocí << řadí za sebe.

Řešení jsou 2:

  1. načtená slova ukládej do vector<string>. Vector je takové inteligentní pole prvků:
    vector<string> newWords;
    for (int x = 0;x < numofWords;x++)
    {
    	string s;//Načtu do pomocného stringu
    	cin >> s;
    	newWords.push_back(s);//Pomocný string vložím na konec vectoru
    }
    
    //příprava pro vypsání atd...
    //Vypsání
    for(size_t i = 0; i != newWords.size(); i++)
    	write << newWords[i] << endl;
    //Popř. alternativní vypsání
    for(vector<string>::const_iterator i = newWords.begin(); i != newWords.end(); i++)
    	write << *i << endl;
  2. Hned jak načteš data do stringu si je ulož do souboru (vše v jednom cyklu)
    for (int x = 0;x < numofWords;x++)
    {
    	string s;//Načtu do pomocného stringu
    	cin >> s;
    	write << s << endl;//Uložení do souboru
    }

Nahlásit jako SPAM
IP: 85.160.49.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
SoftOrig0
Newbie
19. 7. 2012   #3
-
0
-

#2 yaqwsx
Ďakujem už to funguje tak jak ma.
Idem si prelistovat v knihe Vectori nech viem ako to funguje. :)

Nahlásit jako SPAM
IP: 178.40.119.–
SoftOrig0
Newbie
19. 7. 2012   #4
-
0
-

Mám ešte jednu otazku :)

Ak chcem vypisovat zo subora tak aku premennu tam mam zadat ?
Pretoze ked som dal newWords ukazovalo to chybu v prudoch a ked som urobil z size_t i = 0 globalnu premennu ani vtedy mi to neslo tu je kusok zo zdrojoveho kodu.
 

///////////////////////////////////////////////////////////////////////////
	case 1: { 
		system("CLS");
		cout << "Pomoz nam vylepsit hru pridanim novych slov\n";
		cout << "Mozes zadat maximalne 3 nove slova\n";
		////////////Cyklus pridanie slov/////////////////////
		for (int x = 0; x < 3;x++){
			string s;
			cin >> s;
			newWords.push_back(s);

		};
		ofstream write;
	write.open("D:/RandomText.txt",ios::out);
	if (write.fail())
	{ cout << "Subor sa nepodarilo otvorit\n";
	}
	else{
		////////Cyklus ukladania do subora//////
		for(size_t i=0;i!= newWords.size();i++)
		{
			write << newWords[i] << endl;
	};
		if (write.good()) 
	{
		system("CLS");
		cout << "Text bol uspesne ulozeny\n";
		cout << "Slova ktore boli ulozene:\n";
////////////////////////Citanie zo subora///////////////
		read.open("D:/RandomText.txt");
		if (read.is_open()){
			while (!read.eof()){
				read >> newWords.push_back(s); // Tu nastava  problem
				cout << newWords[i];
						cin.get();
//////////////////////////////////////////////////////////////////////////////////


Prave ma napadlo ze urobim dalsi cyklus ale aj tak neviem, ako to zo subora vytiahnut...

Ďakujem :)

Nahlásit jako SPAM
IP: 178.40.119.–
yaqwsx+9
Posthunter
19. 7. 2012   #5
-
+1
-
Zajímavé

read >> newWords.push_back(s);

Tohle je blbost. Funkce push_back vezme její argument a vloží ho na konec vektoru. Nejde do něho číst. Navíc, tady to děláš v jednom cyklu, takže vůbec nepotřebuješ nějaké pole či vektor. Postačí ti string.

if (read.is_open())
{
	while (!read.eof())
	{
		string a;
		read >> s;
		cout << s;
	}
}//Pozor na uzavírací závorky - v tvém kódu chyběly.
Nahlásit jako SPAM
IP: 85.160.49.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
SoftOrig0
Newbie
19. 7. 2012   #6
-
0
-

#5 yaqwsx
Ďakujem veľmi pekne a ano viem už som to všetko opravil len v rychlosti niekedy zabudam a potom sa cudujem preco to nefunguje   

Nahlásit jako SPAM
IP: 178.40.119.–
SoftOrig0
Newbie
19. 7. 2012   #7
-
0
-

#5 yaqwsx
a este jedna otazka naco treba definovat novu premennu string a ked ju vobec nepouzijem ??

Nahlásit jako SPAM
IP: 178.40.119.–
yaqwsx+9
Posthunter
19. 7. 2012   #8
-
0
-

#7 SoftOrig
Trochu jsem zmatený - jestli je to k mému poslednímu kódu, tak tam to proměnná použitá je. A znovu ji definovat je potřeba, protože ta první již neexistuje - proměnná vždy existuje v daném rozsahu - tzn. pouze mezi závorkami {}

int a = 5;
{
	int b = 6;//vytvořím proměnnou b, která však má omezený rozsah platnosti.
	int c = a+b;//Přípustné, obě proměnné existují
}
int c = a + b;//To neprojde kompilátorem - proměnná b již neexistuje
	//Navíc znovu můžu použít jméno c, prootže původní proměnná c již neexistuje.
Nahlásit jako SPAM
IP: 85.160.49.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
SoftOrig0
Newbie
19. 7. 2012   #9
-
0
-

#8 yaqwsx
O tom viem.. ale 
string a;
  read >> s;
  cout << s;
Bola vytvorena premenna "string a" vstup a vystup ma premennu "string s"
Kde je pouzita ?

Nahlásit jako SPAM
IP: 178.40.119.–
voty+1
Návštěvník
19. 7. 2012   #10
-
+1
-
Zajímavé

#9 SoftOrig
Domnívám se, vzhledem ke vzdálenosti A a S na klávesnici, že jde o překlep :)

Abych to tedy doplnil celé, má být:

string s;
  read >> s;
  cout << s;

Nahlásit jako SPAM
IP: 217.195.166.–
Jednu rozbil a tu druhou ztratil.
yaqwsx+9
Posthunter
19. 7. 2012   #11
-
0
-

#9 SoftOrig
#10 voty
Ano, omlouvám se - byl to překlep a nějak jsem si ho nevšimnul. Děkuji za upozonění.

Nahlásit jako SPAM
IP: 85.160.49.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
SoftOrig0
Newbie
19. 7. 2012   #12
-
0
-

#11 yaqwsx


#10 voty
ale pokial znova vytvorim novu premenu string tak ta neobsahuje ziaden text..
takze read >> s je uplne neplatne pretoze do vstupu sa nenacita ziaden znak...
Momentalne mam problem s vytisknutim slov raz mi to slo a uz mi to nejde.. 
 

if (write.good()) 
	  {
		system("CLS");
		ifstream read;
		cout << "Text bol uspesne ulozeny\n";
		read.open("D:/RandomText.txt");
		string s;
		if (!read.is_open())
		{
			while (read.eof())
			{
				read >> s;
                             cout << s << endl // ak pouzijem tuto variantu vytiskne mi to posledne zadane slovo

			};
		};

Tak isto som skusal string s davat ako lokalnu a globalnu premennu a nic sa nezmenilo takze asi ostanem na globalnej ?

Nahlásit jako SPAM
IP: 178.40.119.–
yaqwsx+9
Posthunter
19. 7. 2012   #13
-
0
-

Přehlédl jsem jednu chybičku:

!read.is_open()

Mělo by to být bez vykřičníku - is:open vrací true, pokud je soubor otevřen bez chyb.

Nahlásit jako SPAM
IP: 85.160.49.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
SoftOrig0
Newbie
19. 7. 2012   #14
-
0
-

#13 yaqwsx
a read.eof() s ! teraz mi to funguje ale vratil som sa naspet tam kde som bol pred hodinou a pol...
Ked napisem trebars:
Medved
Macka
Lietadlo
A nasledne chcem vypisat ulozene slova zo subora, ktore su ulozene spravne tak mi vypise slovo Lietadlo 2krat
priklad..
Ulozene slova:
Medved
Macka
Lietadlo
Lietadlo
tu je zdrojak lebo ja uz fakt neviem skusal som poprehadzovat cout ale potom to ani nehne 

if (write.good()) 
	  {
		system("CLS");
		ifstream read;
		cout << "Text bol uspesne ulozeny\n";
		read.open("D:/RandomText.txt");
		if (read.is_open())
		{
			while (!read.eof())
			{
				read >> s;
				cout << s << endl;

			};
			read.close();
			cin.get();
		};

Myslite ze bude problem v tom, ze som "string s" nastavil ako globalnu premennu hned na zaciatku funkcie ??

Nahlásit jako SPAM
IP: 178.40.119.–
SoftOrig0
Newbie
19. 7. 2012   #15
-
0
-

Problem vyrieseny bolo to v tej globalnej premennej.
Ďakujem :)

Nahlásit jako SPAM
IP: 178.40.119.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 75 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý