[C] Textfile Zeile für Zeile einlesen

L

Ladnaks

Ich möchte gerne ein Textfile Zeile für Zeile einlesen. Das mache ich mit
Code:
while((fgets(line1_1,maxZeichen,fp1)!=NULL){
                       //do something
}

Das funktioniert auch wunderbar, aber wenn eine Zeile länger maxZeichen ist habe ich ein Problem. Denn dann wird beim nächsten Schleifendurchlauf in der gleichen Zeile weitergemacht und die restlichen Zeichen eingelesen. Ich will alle Zeichen einer Zeile die nach maxZeichen stehen aber ignorieren. Wie kann ich das machen?
 
Moin,

Du liest nicht wirklich zeilenweise (!)

Vgl. API: The fgets function reads a string from the input stream argument (hier: fp1) and stores it in string (hier: line1_1) - und zwar in Deinem Fall genau maxZeichen !
Du musst also ggf. selbst event. Zeilenumbrüche abfangen!

Willst Du immer nur Zeilenanfänge mit fixer Länge lesen :confused:
Dann würde ich hingehen und in einer Schleife bis zum nächsten Zeilenumbruch lesen und von jedem so entstandenen String dann die überflüssigen Zeichen ausschneiden !

Gruß
Klaus
 
Zuletzt bearbeitet:
Willst Du immer nur Zeilenanfänge mit fixer Länge lesen :confused:
Nein, ich will eigentlich die gesamte Zeile lesen. Aber wenn die Zeile extrem lang ist, also z.B. >1000 Zeichen dann will ich nur bis zur maximalen Länge lesen.
Also wenn ich nun 3 Zeilen habe, 1. mit 10, 2. mit 3 und die 3. mit 1400 Zeichen dann will ich bei den ersten beiden Zeilen alle Zeichen einlesen bei der dritten aber nur die ersten 1000.
99,9% aller Eingaben liegen unter dem Längenlimit für die Zeile. Für die funktioniert es mit fgets wunderbar. Aber falls eine Zeile doch mal drüber ist habe ich oben beschriebenes Problem. Gibt es keine Funktion die einfach die gesamte Zeile einliest, ohne dass ich eine Beschränkung eingeben muss? Dann könnte ich die überschüssigen Zeichen einfach nachher wegschneiden.
 
Nochmal: Du liest nicht zeilenweise, sondern einen Datenstrom!

Es gibt zwar sowas wie getLine, aber IMHO nur unter C++ ...
Musst Du eventuell mal nach googlen, da ich jetzt Feierabend machen darf ;)

Gruß
Klaus
 
Du liest nicht wirklich zeilenweise (!)

Vgl. API: The fgets function reads a string from the input stream argument (hier: fp1) and stores it in string (hier: line1_1) - und zwar in Deinem Fall genau maxZeichen !
Du musst also ggf. selbst event. Zeilenumbrüche abfangen!
Du solltest die Dokumentation vielleicht auch vollständig lesen ;-] Weiter heißt es nämlich (Hervorhebung von mir):
http://msdn.microsoft.com/en-us/library/c37dh6kf.aspx hat gesagt.:
fgets reads characters from the current stream position to and including the first newline character, to the end of the stream, or until the number of characters read is equal to n – 1, whichever comes first.

Nein, ich will eigentlich die gesamte Zeile lesen. Aber wenn die Zeile extrem lang ist, also z.B. >1000 Zeichen dann will ich nur bis zur maximalen Länge lesen.
Also wenn ich nun 3 Zeilen habe, 1. mit 10, 2. mit 3 und die 3. mit 1400 Zeichen dann will ich bei den ersten beiden Zeilen alle Zeichen einlesen bei der dritten aber nur die ersten 1000.
99,9% aller Eingaben liegen unter dem Längenlimit für die Zeile. Für die funktioniert es mit fgets wunderbar. Aber falls eine Zeile doch mal drüber ist habe ich oben beschriebenes Problem. Gibt es keine Funktion die einfach die gesamte Zeile einliest, ohne dass ich eine Beschränkung eingeben muss? Dann könnte ich die überschüssigen Zeichen einfach nachher wegschneiden.
Eine fertige Funktion gibt es dafür (meines Wissens) nicht. Du kannst aber nach dem Einlesen feststellen, ob die Zeile komplett gelesen wurde. Das ist genau dann der Fall, wenn das letzte Zeichen im String ein '\n' ist oder das Ende des Eingabestroms erreicht wurde. Andernfalls musst du so lange die restlichen Zeichen der Zeile auslesen (mit fgetc), bis ein '\n' oder das Ende des Eingabestroms erreicht ist. Danach kannst du die nächste Zeile mit gets auslesen (bzw. bist fertig).

Grüße,
Matthias
 
Zurück