Mit C .txt zeilenweise einlesen

Mhmmm ja, aber ich muss für fgets() doch die Anzahl definieren ode nicht? Was für Parameter muss ich denn angeben? Ich peil das nicht ganz...
 
fgets liest ja nur eine Zeile ein.
Die Zahl, die übergeben wird, ist die Länge vom char-Array.
(Falls die Zeile mehr Zeichen hat als dein Array darf am Arrayende
nicht weiter rausgeschrieben werden).
Aber alles nur auf eine Zeile bezogen.

Und wenn man fgets jetzt mehrmals aufruft werden eben mehrere Zeilen eingelesen...
und für eine Schleife kann man mit feof(filevariable) prüfen, ob das Dateiende erreich wurde
(filevariable durch den echten Variablennamen ersetzen).

Ca. so was:
C++:
FILE *datei;
char zeile[1024];
int zeilenanzahl;

zeilenanzahl = 0;
datei = fopen("bla.txt", "r");
while(!feof(datei))
{
    fgets(zeile, 1024, datei);
    zeilenanzahl++;
}
fclose(datei);

printf("Die Datei hat %d Zeilen\n", zeilenanzahl);
 
Hi.
fgets liest ja nur eine Zeile ein.
Ja. Aber es liest maximal soviel Zeichen ein, wie in das Array passen. Also unter Umständen nicht eine komplette Zeile, wenn die Zeile zu lang ist.

Wenn eine Zeile komplett eingelesen wurde (also in das Array gepasst hat), ist das letzte Zeichen im String ein \n.
und für eine Schleife kann man mit feof(filevariable) prüfen, ob das Dateiende erreich wurde
Nein, nein, nein. Nicht mit feof. Das kann zu einer Endlosschleife führen und erzähle ich nun zum x-ten mal...
C:
while (fgets(zeile, sizeof zeile, datei) != NULL) {
    if (zeile[0] != '\0' && zeile[strlen(zeile+1)] == '\n') zeilenanzahl++;
}
Gruß
 
Zuletzt bearbeitet:
Ja. Aber es liest maximal soviel Zeichen ein, wie in das Array passen. Also unter Umständen nicht eine komplette Zeile, wenn die Zeile zu lang ist.

Ganze Zeile, überflüssigen Rest überspringen:
C++:
int File::readline(FILE *file, char *buffer, int maxlen)
{
	int i;
	if(maxlen < 1)
		return -1;
	if(NULL == fgets(buffer, maxlen, file))
	{
		*buffer = '\0';
		return 1;
	}
	i = strlen(buffer) - 1;
	if(i >= 0 && buffer[i] == '\n')
		buffer[i] = '\0';
	else
	{
		while(fgetc(file) != '\n');
	}
	return 0;
}
(Die Funktion hast du schon öfter gesehen,
also denk ich sie funktioniert unter jeden Bedingungen.
Ersetzt sogar feof :D)
 
Ganze Zeile, überflüssigen Rest überspringen
Ob etwas überflüssig ist oder nicht, möchte ich doch selbst entscheiden.. ;)
(Die Funktion hast du schon öfter gesehen,
also denk ich sie funktioniert unter jeden Bedingungen.
Nö. Du hast da auch eine Endlosschleife wenn fgetc EOF liefert.

Außerdem gibt strlen ein size_t zurück, also einen unsigned. Das wird dann problematisch wenn strlen 0 liefert.

Gruß
 
Zuletzt bearbeitet:
Ja, ich weiss, dass das Thema erledigt ist. Eine Frage habe ich doch noch: Was habt ihr alle mit EOF?
Es geht doch auch einfacher...
C:
FILE* f = fopen("bla.txt","r");
if(f == NULL) return -1;
char temp[512];
while(fgets(temp,512,f) != NULL) printf(temp);
fclose(f);

Vorausgesetzt natürlich, man kennt die Zeichenanzahl.

Gruss
cwriter
 
Zuletzt bearbeitet:
So ich hab hier noch ein kleines Problem. Das zeilenweise auslesen klappt wunderbar, allerdings möchte ich nun jede Zeile in ein array Feld speichern. Das ganz schaut nun so aus:


C:
        for(i = 0; i < NUMBER;i++) {
            fgets(line[i],LENGTH,file);
            feld[i] = line[i];
        }

NUMBER und LENGTH ist im Quellcode definiert und feld ist als char *feld[] in einer header Datei deklariert.
Wie gesagt, das ausgeben der Zeilen klappt(ohne die zuweisung). Nur wenn ich die Zeilen nun in feld abspeichern will, speichert er nur die ersten 2 ab. Ab den 3ten Befehl stürtzt das Programm ab. Ich kann mir das einfach nich erklären und würde mich über eine Lösung freune. :)
 
C++:
feld[i] = line[i];
Strings werde nicht mit = kopiert wie int, float etc.
So richtig:
C++:
strcpy(feld[i],line[i]);

Sonst...mehr Code bitte.
 
Zurück