Thomas wrote:
> Hi,
> Dort gibt es folgenden Code (Ausschnitt):
>
1 | > while( !feof( infile ) ) {
|
2 | > len = 0;
|
3 | > for( i = 0; i < 3; i++ ) {
|
4 | > in[i] = (unsigned char) getc( infile );
|
5 | > if( !feof( infile ) ) {
|
6 | > len++;
|
7 | > }
|
8 | > else {
|
9 | > in[i] = 0;
|
10 | > }
|
11 | > }
|
12 | > .
|
13 | > .
|
14 | >
|
> Da die Abfrage auf EOF nur oben in der while-Bedingung stattfindet,
Nicht ganz.
Schau dir mal die Zeile nach dem getc() an.
Aber: In der Tat wird dieses immer wieder, selbst in Lehrbüchern,
falsch gemacht.
Die Funktione feof() ist nicht dazu gedacht, um damit die Schleife
zu steuern. Die korrekte Art und weise geht immer so:
while( Zeichen konnte gelesen werden ) {
verarbeite Zeichen;
}
if( eof ist nicht aufgetreten )
Behandle Fehlerbedinung beim Lesen vom File
else
File wurde komplett gelesen, mach mit dem gelesenen weiter
C unterstützt dieses Schema dadurch, dass ausnahmslos alle
File Lese Funktionen einen Returnwert haben, der sich zur
Abfrage 'Zeichen konnte gelesen werden' eignet.
Im Falle von getc() liefert getc das Zeichen, bzw. EOF wenn
etwas schief gelaufen ist.
D.h. man zieht diese Schleife korrekter Weise so auf:
1 | int c;
|
2 |
|
3 | i = 0;
|
4 |
|
5 | while( ( c = getc( infile ) ) != EOF && i < 3 ) {
|
6 | in[i] = (unsigned char)c;
|
7 | }
|
8 |
|
9 | in[i] = '\0';
|
10 |
|
11 | if( !feof( infile ) ) {
|
12 | // Behandle die Fehlerbedingung: einlesen vom File ging schief
|
13 | }
|
14 | else {
|
15 | // Behandle den Fall: die Daten wurden korrekt gelesen
|
16 | }
|
Der Unterschied zwischen der Methode hier und der original
Methode ist ganz einfach der, dass letztere Variante in
jedem Fall abbricht, wenn nicht korrekt vom File gelesen werden
konnte. In der ersten Methode kann es passieren, dass dies
ncith der Fall ist. Nämlich dann, wenn das File nicht bis zum
Ende gelesen wurde aber ein Fehler auftrat (Diskette fehlerhaft,
Kratzer in der CD, jemand hat das Laufwerk aufgemacht, Netzwerk-
verbindung ist abgebrochen, etc. Es gibt viele Gründe warum ein
Lesen von einem File schief gehen kann, nicht nur feof().