Ihre Schleife hat mehrere Probleme. Sie schrieb:
while(fscanf(f, "%[^\n\r]s", cLine) != EOF)
/* do something */;
Einige Dinge zu beachten:
fscanf() gibt die Anzahl der Elemente gespeichert. Es kann EOF zurückgeben, wenn es über das Ende der Datei hinaus gelesen wird oder wenn das Dateihandle einen Fehler aufweist. Sie müssen eine gültige Rückgabe von Null unterscheiden. In diesem Fall gibt es keinen neuen Inhalt im Puffer cLine
von einem erfolgreich gelesenen.
Sie haben ein Problem, wenn eine Übereinstimmung nicht auftritt, da es schwierig ist vorherzusagen, wo das Datei-Handle jetzt im Stream zeigt. Dies macht die Wiederherstellung einer fehlgeschlagenen Übereinstimmung schwieriger als erwartet.
Das Muster, das Sie geschrieben haben, tut wahrscheinlich nicht, was Sie beabsichtigten. Es entspricht einer beliebigen Anzahl von Zeichen, die nicht CR oder LF sind, und erwartet dann, dass ein Literal s
gefunden wird.
Sie haben Ihren Puffer nicht vor einem Überlauf geschützt. Eine beliebige Anzahl von Zeichen kann aus der Datei gelesen und in den Puffer geschrieben werden, unabhängig von der Größe, die diesem Puffer zugewiesen ist. Dies ist ein leider häufiger Fehler, der in vielen Fällen von einem Angreifer ausgenutzt werden kann, um beliebigen Code der Angreifer zu wählen.
Sofern Sie nicht ausdrücklich aufgefordert haben, f
im Binärmodus zu öffnen, erfolgt die Zeilenendeübersetzung in der Bibliothek und Sie werden CR-Zeichen normalerweise nicht sehen, und normalerweise nicht in Textdateien.
Sie wollen wahrscheinlich eine Schleife mehr wie folgt aus:
while(fgets(cLine, N_CLINE, f)) {
/* do something */ ;
}
wo N_CLINE ist die Anzahl von Bytes in dem Puffer zur Verfügung einen cLine
starten.
Die Funktion fgets()
ist eine sehr bevorzugte Methode zum Lesen einer Zeile aus einer Datei. Der zweite Parameter ist die Größe des Puffers und liest bis zu 1 Bytes weniger als die Größe aus der Datei in den Puffer. Es beendet den Puffer immer mit einem nul
-Zeichen, damit es sicher an andere C-String-Funktionen übergeben werden kann.
Es stoppt am ersten Ende der Datei, Newline oder buffer_size-1
Byte gelesen.
Es lässt das Newline-Zeichen im Puffer, und diese Tatsache ermöglicht es Ihnen, eine einzelne Zeile länger als Ihr Puffer von einer Zeile zu unterscheiden, die kürzer als der Puffer ist.
Es gibt NULL zurück, wenn aufgrund des Dateiendes oder eines Fehlers keine Bytes kopiert wurden, andernfalls der Zeiger auf den Puffer. Vielleicht möchten Sie feof()
und/oder ferror()
verwenden, um diese Fälle zu unterscheiden.
[^ a-z] schließt tatsächlich a-z in scanf aus. Obwohl die Zeichenfolge, wie oben angegeben, nach "einem Paar Zeichen sucht, wobei das erste kein Zeilenumbruch ist und das zweite ein s" – Tordek
Die fscanf-Dokumentation bei cplusplus.com ist unvollständig. Google 'fscanf scanset'. – Dingo