Ich würde immer die Datei * überprüfen, wie ich Zeichen lese.
Ich denke, es ist eine stilistische Sache, aber ich würde nicht etwas, was ich normalerweise beabsichtige, innerhalb der Schleife passieren.
Schließlich sollte eine erfolgreich gelesene Zeichenfolge immer durch ein '\ 0' beendet werden. Ich bin oft verwirrt darüber, was zu tun ist, wenn ein Fehler aufgetreten ist. Wenn ich weiß, wofür die Funktion ist, könnte ich normalerweise wählen.
So, Ihren Stil der Dateiprüfung mit:
void speek(char *peek, size_t len, FILE *stream) {
int i;
for (i = 0; i < len-1 && !feof(stream); i++) {
peek[i] = fgetc(stream);
}
peek[i] = '\0';
for (i = strlen(peek)-1; i >= 0; i--) {
if (ungetc(peek[i], stream) != peek[i]) {
break; // I'd return an error, but function is void
}
}
}
Wenn dies mehr als ein schnelles Experiment ist, oder ich war dies für andere zu schreiben, könnte ich assert verwendet Parameter zu überprüfen (ja, ich weiß, ich weiß immer noch (c = getc (...)), ich bin alt)
#include <assert.h>
int speek(char *peek, size_t len, FILE *stream) {
assert(peek != NULL);
assert(len > 0); /* Could 0 be okay? */
assert(stream != NULL && !ferror(stream));
int i;
int c;
for (i = 0; i < len-1 && (c=getc(stream)) != EOF; i++) {
peek[i] = c;
}
peek[i] = '\0';
if (ferror(stream)) return -1;
for (int j = i-1; j >= 0; j--) {
if (ungetc(peek[j], stream) != peek[j]) {
return -1;
}
}
return i; /* I like to return something useful */
}
Edit: ich habe versucht, das Original zu spiegeln, aber es ist nicht so, wie ich es tun würde, so dass ich schließlich gab auf und schrieb, was ich eigentlich schreiben wollte.
Edit2: ... Aber ich habe einen Fehler gemacht. Der korrekte Ansatz besteht darin, zu überprüfen, ob Platz für das Zeichen vorhanden ist, bevor es gelesen wird. Do!
Einfache Testprogramm:
int main (int argc, const char * argv[]) {
char line0[100];
int n0 = speek(line0, 4, stdin);
fprintf(stderr, "%d '%s'\n", n0, line0);
char line1[100];
int n1 = speek(line1, 8, stdin);
fprintf(stderr, "%d '%s'\n", n1, line1);
return 0;
}
eine Datei Da nur abcefghij
enthält, gibt
3 'abc'
7 'abcdefg'
Dies ist * die * schwierigste Teil C: Sie im Voraus entscheiden, wie Sie wollen prüfen, und melden Sie Fehler, und Sie haben weder Ausnahmen, noch Stapelabwickeln. Bei E/A-Fehlern, von denen Sie nicht wiederherstellen können, schlage ich vor, das Programm einfach mit einer Fehlermeldung zu stoppen. Für die Frage per se kann jede E/A-Funktion jederzeit fehlschlagen (zB stellen Sie sich vor, die Datei befindet sich auf einem USB-Stick und Sie entfernen sie, während Ihr Programm läuft), also sollten Sie überprüfen, ob * jede * -Funktion korrekt ausgeführt wurde . –