hvernig á að enda línu í c ++


svara 1:

Ein nálgun sem er kannski ekki rétt svar við spurningunni er að nota tellg () til að ákvarða stærð skráar og halda síðan utan um hversu margar persónur hafa verið lesnar og stöðva þegar full stærð skráarinnar hefur lesist.

Eitt mál með notkun EOF sem ég fann var að ég tel að EOF fái ekki skil fyrr en þú reynir að lesa fyrsta stafinn eftir síðustu persónuna. Ég myndi líka biðja til þráðsins hver sé besta leiðin til að ákvarða EOF ef gögnin þín eru ekki einsleit, ég hef tekið fjölda tæknilegra dóma á netinu sem lesa bæði viðskiptaskipti og MP4 og í báðum tilvikum eru strengir og heiltölum blandað saman í tvöföldu skrárnar svo að þú hafir mörg ifstream :: read (char *, size) símtöl sem öll þarf að meðhöndla til að EOF taki á málinu þar sem skránni er ekki lokið. IE hefur ekki fullkomið „met“ í lokin. Ástæðan fyrir því að ég legg til þessa aðferð er sú að þegar síðasti stafurinn er lesinn geturðu í raun ákvarðað EOF með því að bera saman við fulla stærð skjalsins þar sem eins og með EOF þarftu að fara til baka þann síðasta staf.

Besta lausnin sem ég get haft núna er að búa til umbúðaraðgerð sem gerir ifstream :: read () og varpar undantekningu til að merkja eof. Þetta þýðir að bæði strengurinn lesinn og heiltalan, og ef þú varst með flotlestur, hringdu allir í umbúðaaðgerðina sem var varin með undantekningum, kastaðu á EOF eða þegar full stærð skráarinnar var lesin.


svara 2:

Notkun lækja:

Lok línunnar - std :: getline

Lok skráarinnar - notaðu std :: basic_istream :: rdbuf til að fá streambuf og skrifaðu það til std :: stringstream, fáðu síðan strenginn

Dæmi:

# innifalið # innifalið # innifalið int aðal (int argc, char ** argv){ ef (argc <2) { std :: cerr << "Ógildur fjöldi röksemda" << std :: endl; skila 1; } std :: string fileName {argv [1]}; std :: ifstream inntak (fileName); ef (! input.good ()) { std :: cerr << "Gat ekki opnað skrá" << std :: endl; } std :: strengjalína; std :: getline (inntak, lína); std :: cout << "Fyrsta lína:" << lína << std :: endl; input.seekg (0); std :: strengjainnihald; { std :: ostringstream framleiðsla; framleiðsla << input.rdbuf (); innihald = output.str (); } std :: cout << "Fullt innihald:" << innihald << std :: endl; skila 0;}

svara 3:

Eins og Sergey Zubkov sagði, ef þú vilt lesa línu skaltu nota aðgerð sem stöðvast þegar skránni lýkur. Til dæmis er hægt að gera þetta eins og svo.

# innifalið # innifalið að nota namespace std; aðal aðal (){ strengir; meðan (cin >> s) { cout << s << endl; }skila 0;}

Notaðu std :: getline til að lesa til loka línu.

# innifalið # innifalið að nota namespace std; aðal aðal (){ strengir; meðan (std :: getline (std :: cin, s)) { cout << s << endl; }skila 0;}

svara 4:

Til að lesa skrána til enda í C ++ geturðu notað hvaða inntaksaðgerð sem er þar til hún skilar fölsku:

# innifalið # innifalið aðal aðal (){ std :: ifstream f ("thefile.txt");std :: vektor v; fyrir (int n; f >> n;) v.push_back (n);}

Lifandi kynningu (með framleiðslu):

Áhorfandi Coliru

Eða, til að auka viðbragð, gætir þú túlkað skrána þína sem röð heiltala og bara breytt einni röð í aðra:

# innifalið # innifalið # innifalið aðal aðal (){ std :: ifstream f ("thefile.txt");std :: vektor v {std :: istream_iterator (f), {}};}

Lifandi kynningu (með framleiðslu):

Áhorfandi Coliru

PS: feginn að enginn birti neitt af því meðan (! File.eof ()) bull


svara 5:

Notaðu std :: ifstream :: read (char * s, streams size n).

Hér er góð tilvísunarsíða, með kóðadæmi og öllu:

istream :: lesa - C ++ tilvísun