jak ukončit řádek v C ++


Odpověď 1:

Jedním z přístupů, které nemusí být skutečnou odpovědí na otázku, je použít tellg () k určení velikosti souboru a poté sledovat, kolik znaků bylo přečteno, a zastavit se po přečtení plné velikosti souboru.

Jeden problém s používáním EOF, který jsem našel, byl ten, že věřím, že se EOF nevrátí, dokud se nepokusíte přečíst první znak za posledním znakem. Také bych se zeptal na vlákno, jaký je nejlepší způsob, jak určit EOF, pokud vaše data nejsou homogenní, provedl jsem řadu online technických recenzí a přečetl jsem zprávy Trading Exchange i MP4 a v obou případech existují řetězce a celá čísla smíchaná do binární soubory, takže nakonec budete mít několik volání ifstream :: read (char *, size), které je třeba zpracovat, aby se EOF vypořádal s případem, kdy soubor není úplný. IE nemá na konci úplný „záznam“. Důvod, proč navrhuji tento přístup, je ten, že při čtení posledního znaku můžete skutečně určit EOF porovnáním s plnou velikostí souboru, kde stejně jako u EOF se musíte vrátit zpět k poslednímu znaku.

Nejlepším řešením, které teď mohu mít, je vytvořit obalovou funkci, která provede ifstream :: read () a vyvolá výjimku pro signalizaci eof. To znamená, že jak řetězec načtený, tak načtený celé číslo, a pokud byste měli plovoucí čtení, všichni by volali do funkce obálky, která byla chráněna pomocí výjimky házet na EOF, nebo když byla načtena plná velikost souboru.


Odpověď 2:

Používání streamů:

Konec řádku - std :: getline

Konec souboru - použijte std :: basic_istream :: rdbuf k získání streambuf a zapište jej do std :: stringstream, poté získejte řetězec

Příklady:

#zahrnout #zahrnout #zahrnout int main (int argc, char ** argv){ if (argc <2) { std :: cerr << "Neplatný počet argumentů" << std :: endl; návrat 1; } std :: string název_souboru {argv [1]}; std :: ifstream vstup (název souboru); if (! input.good ()) { std :: cerr << "Soubor nelze otevřít" << std :: endl; } std :: řetězec; std :: getline (vstup, řádek); std :: cout << "První řádek:" << řádek << std :: endl; input.seekg (0); std :: obsah řetězce; { std :: výstup ostringstream; output << input.rdbuf (); obsah = výstup.str (); } std :: cout << "Celý obsah:" << obsah << std :: endl; návrat 0;}

Odpověď 3:

Jak řekl Sergey Zubkov, pokud chcete číst řádek, použijte funkci, která se zastaví, když soubor skončí. Například to lze udělat takhle.

#zahrnout #zahrnout pomocí jmenného prostoru std; int main (){ řetězec s; while (cin >> s) { cout << s << endl; }návrat 0;}

Pro čtení do konce řádku použijte std :: getline.

#zahrnout #zahrnout pomocí jmenného prostoru std; int main (){ řetězec s; while (std :: getline (std :: cin, s)) { cout << s << endl; }návrat 0;}

Odpověď 4:

Chcete-li číst soubor až do konce v C ++, můžete použít libovolnou vstupní funkci, dokud nevrátí hodnotu false:

#zahrnout #zahrnout int main (){ std :: ifstream f ("thefile.txt");std :: vektor proti; pro (int n; f >> n;) v.push_back (n);}

Živé demo (s výstupem):

Prohlížeč Coliru

Nebo pro větší vkus můžete svůj soubor interpretovat jako posloupnost celých čísel a jen převést jednu sekvenci na druhou:

#zahrnout #zahrnout #zahrnout int main (){ std :: ifstream f ("thefile.txt");std :: vektor v {std :: istream_iterator (f), {}};}

Živé demo (s výstupem):

Prohlížeč Coliru

PS: rád, že nikdo nic z toho nezveřejnil, zatímco (! File.eof ()) nesmysly


Odpověď 5:

Použijte std :: ifstream :: read (char * s, streamsize n).

Tady je dobrá referenční stránka s příkladem kódu a vším:

istream :: read - C ++ Reference