Traverse-DATEI Zeile für Zeile mit fscanf
Ok also ich habe eine text-Datei database.txt.
Jede Zeile ist ein Benutzer mit dem folgenden format
"John Smith"| 4| 80.00| "123 Lollipop Lane"| "New Jersey"| "08080"
Wenn ich versuche, Folgendes tun:
database = fopen(fileName,"r");
while(fscanf(database,"%[^\n]", buffer) != EOF){
printf("ATTEMPT TO: Insert user %s\n\n", buffer);
if (insert_Customer(clients, create_Customer(buffer)) < 0){
printf("\nERROR: Failed to insert and create customer %s\n", buffer);
}
else printf("\nSUCCESS: Inserted Customer %s\n\n", buffer);
}
Läuft es gut für die erste Zeile, Versand in die GESAMTE Zeile, um die create_Customer(char * Puffer) Funktion. Aus irgendeinem Grund verstehe ich nicht, nach der ersten Zeile, es ständig versucht zu senden "John Smith", anstatt sich auf die nächste Zeile. Ich glaube, mein format ist falsch aber ich kann nicht herausfinden, wie das zu erreichen ist, was ich versuche zu erreichen ist diese Datei zu Lesen, Zeile für Zeile, und übergeben Sie jede Zeile in den create_Customer Funktion.
Überprüfen Sie den Rückgabewert von fscanf für die Anzahl von Zeichen Lesen nach dem ersten erfolgreichen Lesen. Auf eine wilde erraten, es ist 0 zurückgeben, weil du es gesagt hast, etwas zu Lesen außer eine neue Zeile
InformationsquelleAutor Brandon Amir | 2013-11-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, Sie brauchen eine Schließung
\n
in Ihrem Muster. Ich sah eine Reihe von text mit Bildlauffunktion mit der gleichen ersten Zeile mit%[^\n]
, aber mit%[^\n]\n
sah ich die erwartete Ausgabe.Jedoch, wenn die Zeile in der Datei übersteigt, dass der Puffer, die Sie möglicherweise ausführen in ein problem, wo Sie den Puffer nicht genügend Platz. Die Ergebnisse
Test v1:
Code
Ergebnisse
Test v2:
Let ' s korrigieren Sie den code, so dass wir nicht überrannt unser Puffer. Wir tun dies, indem
%[^\n]\n
zu%30[^\n]\n
. Dies sagt fscanf, dass es nur verwendet werden kann, bis die Größe des Puffers -- 30.Code
Ergebnisse
Sieht es aus wie es funktioniert!
test.txt
Dies ist, was die test-Datei sieht folgendermaßen aus, dass ich mit war.
Irgendeinem Grund Sie mit
fscanf
und nichtfgets
?Eine Sache zu beachten, wenn Sie
fgets
möchten Sie vielleicht Streifen die\n
Charakter, weil Sie als Teil der Zeichenfolge.Vom cplusplus.com
fgets
:Beispiel:
Eines dieser Beispiele ist das nicht? Welche?
InformationsquelleAutor rkyser
Das problem ist, dass Ihr
fscanf
nie Lesen Sie den Zeilenumbruch am Ende der ersten Zeile. Also, wenn es ist das zweite mal aufgerufen, es schlägt fehl (0 zurückgeben, nicht EOF) und Lesen nichts, verlassenbuffer
unverändert.Könnte man hinzufügen, einen Anruf zu
fscanf("%*[\n]");
am Ende deiner while-Schleife zu überspringen, die das Zeilenende (und keine leeren Zeilen, die auftreten könnten). Oder Sie könnten einfach verwendenfgets
statt, das macht es auch einfacher, Sie zu vermeiden den potentiellen buffer-overflow-problem.InformationsquelleAutor Chris Dodd
Verwenden Sie fgets, statt
fscanf
!Diefscanf
liest, bis es Fleisch \n (new line) Zeichen ,in der Erwägung, dass Sie verwenden können, fgets zum Lesen aller Zeilen mit den exakt gleichen code, den Sie verwendet!Hoffe, dass hat geholfen 🙂
InformationsquelleAutor Themis Beris
Sollten Sie einen Zuschnitt nach dem Bezeichner "%[^\n] " oder "%[^\n]\n". Beides wird Ihnen erlauben, überspringen Sie die neue-Zeile-Zeichen.
oder
InformationsquelleAutor Ali Eren Çelik