PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : fgetc, array & putchar, wo ist der haken?



xzm
21-04-2008, 18:32
hab hier bisschen code fabriziert:


#include <stdio.h>
#include <stdlib.h>

int main() {
FILE *stream;
char *datei = "bla.txt";
int ch[1001];
if((stream = fopen(datei, "r")) == NULL) {
printf("could not open %s\n", datei);
exit(1);
}
while(!feof(stream)) {
for(i=0; i != 1000; i++) {
ch[i] = fgetc(stream);
}
}
fclose(stream);
for(i = 0; i != 1000; i++) {
putchar(ch[i]);
}
exit(0);
}


damit sollen aus einer datei einfach eine zahlenkette gelesen werden und in ein array (ch) geschrieben werden.
das problem ist, dass ich zwar sozusagen die richtige anzahl an zeichen bekomm (auch wenn ich mir zB ch[0] anzeigen lasse), allerdings sind es nicht die zahlen, sondern sowas:

�������������������������������������������������� �������������������������������������������������� �������������������������������������������������� �������������������������������������������������� �������������������������������������������������� �������������������������������������������������� �������������������������������������������������� �������������������������������������������������� �������������������������������������������������� �������������������������������������������������� �������������������������������������������������� �������������������������������������������������� �������������������������������������������������� �������������������������������������������������� �������������������������������������������������� �������������������������������������������������� �������������������������������������������������� �������������������������������������������������� �������������������������������������������������� �������������������������������������������� �����

wenn ich das putchar(ch[i]) direkt nach dem ch[i] = fgetc (...) aufrufe, dann klappt es, allerdings wird ganz am ende des zahlenstrangs auch ein solches zeichen � angezeigt.
mir scheint es komisch, denn die zahlen sollten ja so oder so im array gespeichert werden, unabhängig davon, in welcher schleife ich es ausgeben lasse... gdb sagt mir nix, außer dass alles glatt läuft.

sicher wieder nen trivialer fehler, allerdings komm ich (mal wieder) nich drauf :rolleyes:

hoff ich nerv nich zu arg, hab sozusagen änfängerprobleme ;)

BLUESCREEN3D
21-04-2008, 19:44
while(!feof(stream)) {
for(i=0; i != 1000; i++) {
ch[i] = fgetc(stream);
}
}
Hier verschachtelst du zwei Schleifen, d.h. die for-Schleife wird mehrfach ausgeführt, falls du Datei nach 1000 Byte nicht zu Ende ist.

Also darfst du nur eine Schleife nutzen.
Übrigens: feof() gibt erst dann true zurück, wenn das Lesen bereits einmal fehlgeschlagen ist.

Um also maximal 1000 Byte zu lesen:

for(i=0; i != 1000; i++) {
ch[i] = fgetc(stream);

if (ch[i] == EOF) { /* das geht nur, weil ch int und nicht char ist */
break;
}
}
ch[i] = 0;