n-te Zeile eines Steams ausgeben klappt nicht ganz...
-
Heyo,
mein Programm soll die n-te zeile einer Datei ausgeben.
Aber egal welche Zeile ich eingebe, es wird immer die 2. Zeile ausgegeben.
// 18.16.4 read_nline #include <stdio.h> #include <stdlib.h> #include <string.h> #define BUF 255 char temp[BUF]; char puffer[BUF]; char *getline (int zeile, FILE *datei) { int i; // Bis n-te Zeile hochzählen for (i=0; i<zeile-1; i++) { //Falls Zeile nicht existiert, NULL zurückgeben if ( (fgets (temp, BUF, datei) == NULL ) ) { return NULL; } //n-te Zeile erreicht if ( (fgets (puffer, BUF, datei) == NULL) ) { return NULL; } //Wenn Zeile existiert, an Aufrufer zurückgeben else { return puffer; } } } int main (void) { FILE *quelle; char *ntezeile; char name[20]; int zeile; //Welche Datei? printf ("Dateiname: "); scanf ("%s",name); //Datei öffnen quelle = fopen (name, "r"); //Existiert Datei? if (NULL == quelle) { fprintf (stderr, "Quelldatei %s existiert nicht...",name); //return EXIT_SUCCESS } //Welche Zeile? printf ("Welche Zeile?"); printf ("> "); scanf ("%d",&zeile); ntezeile = getline (zeile, quelle); //Falls Zeile nicht existiert, Fehlermeldung if (NULL == ntezeile) { printf ("Zeile nicht vorhanden?"); //return EXIT_SUCCESS; } //Wenn Zeile existiert, auf Bildschirm ausgeben else { fputs (ntezeile, stdout); } for(;;); return EXIT_SUCCESS; }
Weiß jemand wo der Haken ist?!
Greez
Haimi
-
Hi!
Das liegt an deiner getline Funktion. Ist die Anzahl der Zeilen >= 2, wird immer die zweite Zeile zurückgegeben.
-
Hmm... ich habs jetzt durch andere Klammersetzung gelöst... allerdings verstehe ich die Lösung selbst nicht so ganz...
Warum darf ich die gesamte For-Schleife nicht klammern?!
Ich habe die { in Zeile 14 und die } in Zeile 28 entfernt... dadurch läuft es...
// 18.16.4 read_nline #include <stdio.h> #include <stdlib.h> #include <string.h> #define BUF 255 char temp[BUF]; char puffer[BUF]; char *getline (int zeile, FILE *datei) { int i; // Bis n-te Zeile hochzählen for (i=0; i<zeile-1; i++) //Falls Zeile nicht existiert, NULL zurückgeben if (fgets (temp, BUF, datei) == NULL ) { return NULL; } //n-te Zeile erreicht if (fgets (puffer, BUF, datei) == NULL) { return NULL; } //Wenn Zeile existiert, an Aufrufer zurückgeben else { return puffer; } } int main (void) { FILE *quelle; char *ntezeile; char name[20]; int zeile; //Welche Datei? printf ("Dateiname: "); scanf ("%s",name); //Datei öffnen quelle = fopen (name, "r"); //Existiert Datei? if (NULL == quelle) { fprintf (stderr, "Quelldatei %s existiert nicht...",name); //return EXIT_SUCCESS } //Welche Zeile? printf ("Welche Zeile?"); printf ("> "); scanf ("%d",&zeile); ntezeile = getline (zeile, quelle); //Falls Zeile nicht existiert, Fehlermeldung if (NULL == ntezeile) { printf ("Zeile nicht vorhanden?"); //return EXIT_SUCCESS; } //Wenn Zeile existiert, auf Bildschirm ausgeben else { fputs (ntezeile, stdout); } for(;;); return EXIT_SUCCESS; }
-
Du kannst noch ein paar Zeilen mehr weglassen. Du liest bis zum gewünschten Zeilenindex ein, ist die Datei vorher zu ende, liefert fgets NULL. Danach noch einmal fgets aufzurufen macht keinen Sinn, weil die Datei ja zu ende ist.
Dann könntest du dir auch noch überlegen ob es sinnvoll ist, einen Zeiger auf ein globales Array zurück zu geben.