Ezzel mi a gond és hogyan lehetne a hibáit javítani?
Az egyik kérdésnél felmerült az alábbi - valami miatt sokat kritizált - kódrészlet:
std::ifstream ifs("test.txt");
ifs.open();
while(!ifs.eof()) {
// ...
}
Egyáltalán nem ismerem a C++ nyelvet (C#-pban és PHP-ban fejlesztek), de ezt a mintát kezdő programozóként én is nagyon sok helyen látom. Valaki felvilágosítana, hogy mi ezzel a gond?
#8/#9:
Azt hiszem a kérdező nem egy olyan kódra gondolt ami alapból nem is működik. Mert ti amiről beszéltek az valami olyasmi amit egy óvodás nem merne leírni: beolvasás után nem leellenőrizni hogy elérte e a fájl végét. Valószínűleg nem erre kérdezett rá a kérdező.
#9 A példád hülyeség úgy ahogy van. Nem csak akkor ha üres a fájl, hanem mindig. Amit leírtál nem működőképes kód és szerintem nem gondoltad át a dolgot. Ha nem üres a fájl akkor is hibát fog visszadobni.
A képlet pedig elég egyszerű és érthető: beolvasás után ellenőrizni kell, hogy sikerült e a beolvasás. Hogy ezt a függvény visszatérési értékéből állapítod e meg vagy a good() függvénnyel, az teljesen mindegy. Általános esetben mindig használható a good().
Mért küldenék a cppreference szerkesztőjének tockost? Ott úgy van írva, ahogy annak C++ kódban illik lennie:
"This operator makes it possible to use streams and functions that return references to streams as loop conditions, resulting in the idiomatic C++ input loops such as while(stream >> value) {...} or while(getline(stream, string)){...}. Such loops execute the loop's body only if the input operation succeeded."
Illetve ha cikluson kívül nincs szükség a változóra illik for ciklusba rakni:
for(std::string s, std::getline(stream, s); ) { ... }
"#6-os írta hogy a good() elfogadott módszer a beolvasás tesztelésére, még példát is írt."
Na álljunk meg. Az oké, hogy írt példát, az működik is (bár nem túl szép, még a breakes is jobb, amit te írtál, de az már for-ért kiált, úgyhogy inkább az).
De amit először írt, csak annyi volt, hogy ki kell cserélni a while feltételét. Az eredeti kérdésben szereplő kód viszont elvben hibás, nem attól, hogy good vagy fail vagy eof, de ez a linkelt SO kérdésben benne van, sőt, ott van minden, úgyhogy vitázni nem is kell rajta tovább.
@#12: Gondolom a kódismétlés miatt akartál tockosokat osztogatni, de te jobban tudod. Az biztos hogy a cppreference szereti pont ugyan azt leírni példáiban amiért szerinted tockos járna. Pl.:
Senki sem kétli hogy vannak függvények amik implicit ellenőrzik a good() függvényt és ezt jelzik a visszatérési értékben, és talán arról sincs kétség hogy vannak olyanok amik nem. Innentől kezdve remélem belátod hogy amit írsz az ekvivalens a good() megoldásával, ami az általános esetet tükrözné. Sajnálatos hogy nem minden beolvasási mód kerülhet ciklusfeltételbe még az stdlibben sem, azon kívül meg pláne.
@#14: Azt nem a #6 írta hanem én és az arra vonatkozott hogy az eof() használata miért rossz. Egy szóval sem írtam hogy jó megoldás az, hogy nem ellenőrzöd azt amit beolvasol. Ezt te találtad ki. Feltételezheted hogy a kérdés egy olyan teoretikus példát mutatna be ami működőképes, de nem biztonságos (több-kevesebb sikerrel).
"Azt nem a #6 írta hanem
Igen, igen, ez rögtön meg is magyarázza, miért ugrott neki a #4-nek..
Mindegy, bárki, akit a megoldás érdekel, és nem a flame, az ugorjon a linkre.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!