Forum: Compiler & IDEs Verständnisproblem: End Of File


von Hilfreicher Helfer (Gast)


Lesenswert?

Hi,
ich lese auf meinem PC eine Datei mit C ein. Das Prinzip sieht so aus:
1
while(byte != EOF)
2
{
3
   byte = getc(input);
4
   ...
5
}

input ist hier ein File-Pointer, und byte ein char. Das Problem: Wenn 
nun ein Byte in der Datei den gleichen Wert wie EOF enthält, terminiert 
die Schleife ungewollt, sie soll bis zum Dateiende durchlaufen. Gibt's 
da Möglichkeiten, dass zu verhindern?

MfG
HiHel

von (prx) A. K. (prx)


Lesenswert?

Hilfreicher Helfer schrieb:
> da Möglichkeiten, dass zu verhindern?

Indem die Variable °byte" als "int" deklariert wird.

Bleibt dann aber trotzdem falsch, da ... trotz EOF ausgeführt wird.

von gffdg (Gast)


Lesenswert?

Wenn du Textdateien liest, dann ist das kein problem, sonst mit:
1
 int feof(FILE *stream)

von Karl H. (kbuchegg)


Lesenswert?

Hilfreicher Helfer schrieb:

> die Schleife ungewollt, sie soll bis zum Dateiende durchlaufen. Gibt's
> da Möglichkeiten, dass zu verhindern?

getc liefert aus gutem Grund einen int und keinen unsigned char
Damit KANN kein Byte in deinem File denselben Wert haben.
Du musst getc in einen int einlesen lassen und nur dann, wenn das nicht 
gleich mit EOF ist, erst dann kannst du das in Form eines unsigned char 
verwenden.
1
  int c;
2
3
  while ((c = fgetc(ptr)) != EOF)
4
  {
5
    ... mach was mit c
6
  }

Siehe zum Beispiel
Kernighan&Ritchie
Programmieren in C

irgendwo ganz am Anfang des Buches, wenn es das erste mal ums Lesen aus 
einem Stream geht.

von Hilfreicher Helfer (Gast)


Lesenswert?

Hi,
du musst die Datei als "rb" öffnen, nicht als "r":
1
input = fopen("C:/datei", "rb");
.

von Hilfreicher Helfer (Gast)


Lesenswert?

Hilfreicher Helfer schrieb:
> Hi,
> du musst die Datei als "rb" öffnen, nicht als "r":
> input = fopen("C:/datei", "rb");

Hey, genau das war mein Problem. Vielen Dank!

MfG
HiHel

von Sven P. (Gast)


Lesenswert?

Ich dachte immer, das 'b' hätte nur Einfluss auf die _Zeilen_-Enden?

von Hilfreicher Helfer (Gast)


Lesenswert?


von Hilfreicher Helfer (Gast)


Lesenswert?

Hey, danke für den Link. Da ist das ja wirklich super erklärt!

von Hilfreicher Helfer (Gast)


Lesenswert?

Ger

Hilfreicher Helfer schrieb:
> Hey, danke für den Link. Da ist das ja wirklich super erklärt!

Gern geschehen!

von (prx) A. K. (prx)


Lesenswert?

Ein Erbe des DOS-Vorgängers CP/M, bei dem es keine exakte File-Länge gab 
und das Ende von Textfiles durch Ctrl-Z signalisiert wurde. In DOS gab 
es zwar die exakte Filelänge, aber das Ctrl-Z in den Files blieb 
erhalten.

von Sven P. (Gast)


Lesenswert?

Ach du liebes Bisschen. Stimm, da waren ja nur Blöcke in der FAT 
vermerkt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.