5:00
Aufgabe: Schreibe eine main-Funktion, die die erste Zeile aus einer Datei einliest, deren Dateiname deinem Programm als erster Kommandozeilenparameter übergeben wurde, und diese Zeile ausgibt. Auf #include kannst du verzichten. Triff sinnvolle Annahmen.
Hinweise zu den Funktionssignaturen:
FILE *fopen(const char *filename, const char *mode);
char *fgets(char *str, int n, FILE *stream);
// Liest bis zu n-1 Zeichen in str, stoppt bei Newline oder EOF
Versuche diese Aufgabe in der verfügbaren Zeit auf Papier oder in VS Code zu lösen. Wenn du fertig bist oder die Zeit abgelaufen ist, kannst du deine Lösung überprüfen:
Lösung:
int main(int argc, char *argv[]) {
FILE *f = fopen(argv[1], "r");
if (f == NULL) {
return 1; // Datei konnte nicht geöffnet werden
}
char line[1024];
if (fgets(line, 1024, f) != NULL) {
printf("%s", line); // fgets behält \n, daher kein \n nötig
}
fclose(f);
}
Zu treffende Annahme: Die maximale Zeilenlänge muss angenommen werden. Im Beispiel sind es 1024 Zeichen - ein anderer Wert (z.B. 256, 512, 4096) wäre auch OK gewesen.
Alternative mit malloc (Heap statt Stack):
int main(int argc, char *argv[]) {
FILE *f = fopen(argv[1], "r");
if (f == NULL) {
return 1;
}
char *line = malloc(1024);
if (line == NULL) {
fclose(f);
return 1;
}
if (fgets(line, 1024, f) != NULL) {
printf("%s", line);
}
free(line);
fclose(f);
}
Guter Stil: Rückgabewerte von fopen, malloc und fgets auf NULL prüfen!
Hinweis: Dass man den Rückgabewert von fgets auf NULL prüfen sollte, haben wir in der Vorlesung bisher nicht behandelt. Wenn du das vergessen hast, kannst du trotzdem "Ja" ankreuzen.
Mögliche Fehler: fopen vergessen, falscher "mode", kein Buffer, fclose vergessen, argv[1] vergessen
Konntest du die Aufgabe in der Zeit lösen?