Permalänk
Medlem

while loop c++

Hej!

har en uppgift i programmerings kurs, där vi ska läsa in en fil och sortera up de så som vi villl de ska skrivas ut i en ny fil.
mitt problem är att jag har skapat en while loop med vilkoret är strömen från in filen och när jag kör min test med denna kod:

int main() { string line1,line2,line3; ifstream in; in.open("names.txt"); ofstream out; out.open("sort.txt"); while( in.good() ) { getline(cin, line1); getline(cin, line2); getline(cin, line3); out << line1 << endl << line2 << endl << line3 << endl << endl; } in.close(); out.close(); return 0; }

de som händer är att det blir en oändlig loop som skriver in den sista raden i in strömmen.... så jag är tvungen av avbryta själv tänkte höra om någon har ett svar på detta?

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Medlem

Vad jag ser så har du inget som bryter loopen, därav att den blir oändlig. Försök att sätta in en if sats som kollar ifall du är på sista raden och då stänga a streamen till filen. Loopen bör då brytas.

Edit: nu är jag inte expert på C ++ men kanske smidigare om du kör något i stil med:

while (in.open()) { //Din kod if ( //kolla om du är på sista raden i filen) in.close(); }

Permalänk
Datavetare

Din getline tar cin i stället för in som argument, där ligger nog ditt problem.

Men du bör testa att strömmen är "good" efter varje anrop till getlineios::eofbit kommer sättas om du når slutet av filen och då blir det skräp i strängvariabeln (eller rättare sagt, den kommer behålla sitt värde från förra varvet i loopen) då getline tittar om man nått slutet av filen och om så är fallet gör den ingenting.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

nu har jag skrivit om koden så här:

int main() { string name,ssn,adress; ifstream in; in.open("names.txt"); ofstream out; out.open("sort.txt"); while( in.good() ) { getline(in, name); in.good(); getline(in, ssn); in.good(); getline(in, adress); in.good(); out << name << "\n" << ssn << "\n" << adress << "\n" << "\n"; } in.close(); out.close(); return 0; }

och får utskriften:

Måns Hansson 8510309159 Bössgränd 90, 373 02 RAMDALA Olliver Lindberg 8602024898 Sandviken 76, 710 27 DYLTABRUK Eskil Johnsson 7901105838 Löberöd 29, 521 29 KÄTTLISTORP 7901105838 Löberöd 29, 521 29 KÄTTLISTORP

som ni nu ser så skriver den ut två sista raderna två gånger, har ni nå tips på de?

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Medlem

if(line3 == '\n') { break; }

Nånstans i loopen för att gå ur när slutet av line3 är nådd kanske.
Jag är osäker på vad det är du vill göra.

Visa signatur

Intel Core i7 3770K 3,5Ghz @ 4,5Ghz, Noctua NH-D14, ASUS P8Z77-V , 16GB Corsair Vengeance DDR3 1600MHz, Gigabyte Nvidia GTX 660, Samsung 830 128GB, OCZ Vertex 2 60GB, WD 250GB, Corsair TX 650W, BenQ G2420HDBE, HP L2208w.

Permalänk
Medlem
Skrivet av Tobijjah:

if(line3 == '\n') { break; }

bra för slag kommer inte funka här dock

names.txt innehåller i orginal filen ca 500 namn
som står på detta sätt

förnamn efternamn person nr adressrad

detta ska jag sortera till en viis ordning men först vill jag att den ska skriva in samma sak i sort.txt fast enter mellan varje person och en rad får inte åter komma.
efter programet gör detta ska jag leka lite med sub string osv för att få de på den formen som uppgiften kräver av mig.

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Hedersmedlem
Skrivet av Mejan:

som ni nu ser så skriver den ut två sista raderna två gånger, har ni nå tips på de?

Observera att ensamma
in.good();
inte gör någon nytta. Testa istället till exempel efter att du har försökt läsa in allt som skall skrivas ut.

Permalänk
Datavetare
Skrivet av Mejan:

som ni nu ser så skriver den ut två sista raderna två gånger, har ni nå tips på de?

Var precis det jag försökte uppmärksamma dig på. Antar att din textfil avslutas med att sista raden avslutas med ett "\n" tecken.

Ditt problem blir då att in.good() fortfarande kommer retunera true efter "Löberöd 29, 521 29 KÄTTLISTORP" då du ännu inte försökt läsa bortom EOF, men precis detta händer när getline(in, line1); körs för den sista tomma raden (som inte innehåller några tecken alls). Du får då en tom sträng och ios::eofbit kommer sättas i strömmen. De två efterföljande anropen till getline kommer då inte göra något alls och lämna det gamla innehållet i line2 och line3 intakt.

Därför ser du

Eskil Johnsson 7901105838 Löberöd 29, 521 29 KÄTTLISTORP 7901105838 Löberöd 29, 521 29 KÄTTLISTORP

Nog bättre att bryta ut inläsningen av en post till en egen funktion som talar om huruvida den lyckades läsa in tre rader utan att nå EOF.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

yes jag löste detta genom att gör en if med ungefär en sådan som tidigare la up

if(name=="") { break; }

tack så mycket för all hjälp allihopa

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6