Ik zit voor de fun een paar programmeer opgaven te maken en daar moet je regelmatig input regel voor regel inlezen en die dan verwerken. Dus RickN typt:
Leek me redelijk basic. Nou zit ik te testen, met een file met 5 te verwerken regels, blijk ik 6 output regels te krijgen?! Als ik die file in een hexeditor open blijkt dat na de laatste regel die afgesloten wordt met een LF (werk onder linux) nog een null-byte te staan (al heb ik gemerkt dat dit niet altijd zo is). Nu vind cin.eof() dus dat we na de laatste regel nog niet aan het einde zijn en dat er nog één regel moet worden verwerkt. Dat vind ik dus vreemd, een null-byte is toch geen data meer? Ik heb het nu opgelost door er het volgende van te maken:
Dat werkt, maar ik vind het zo raar dat ik een file doorloop zonder op eof() te testen. En waarom snap getline() wel dat een nullbyte geen data meer is en eof() niet? Is dit de bedoeling van istream klasse? Zo ja, waar is de eof() methode dan voor? Of moet ik gewoon wel op eof() testen en na elke getline() controleren of ik zinnige data heb gelezen?
Basically, wat is "best practice" bij het regel voor regel (maar eigenlijk in het algemeen) doorlopen van een file?
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| #include <iostream.h> int main() { char buffer[256]; int resultaat; while (!cin.eof()) { cin.getline(buffer,256); resultaat = verwerk(buffer); cout << resultaat << endl; }; } |
Leek me redelijk basic. Nou zit ik te testen, met een file met 5 te verwerken regels, blijk ik 6 output regels te krijgen?! Als ik die file in een hexeditor open blijkt dat na de laatste regel die afgesloten wordt met een LF (werk onder linux) nog een null-byte te staan (al heb ik gemerkt dat dit niet altijd zo is). Nu vind cin.eof() dus dat we na de laatste regel nog niet aan het einde zijn en dat er nog één regel moet worden verwerkt. Dat vind ik dus vreemd, een null-byte is toch geen data meer? Ik heb het nu opgelost door er het volgende van te maken:
C++:
1
2
3
4
| while (cin.getline(buffer,256)) { .... } |
Dat werkt, maar ik vind het zo raar dat ik een file doorloop zonder op eof() te testen. En waarom snap getline() wel dat een nullbyte geen data meer is en eof() niet? Is dit de bedoeling van istream klasse? Zo ja, waar is de eof() methode dan voor? Of moet ik gewoon wel op eof() testen en na elke getline() controleren of ik zinnige data heb gelezen?
Basically, wat is "best practice" bij het regel voor regel (maar eigenlijk in het algemeen) doorlopen van een file?
edit:
Misschien is het handig te vermelden dat ik de data vanuit een file naar m'n progje pipe, vandaar dat ik cin gebruik.
Misschien is het handig te vermelden dat ik de data vanuit een file naar m'n progje pipe, vandaar dat ik cin gebruik.
[ Voor 12% gewijzigd door RickN op 21-11-2002 19:41 ]
He who knows only his own side of the case knows little of that.