Ich versuche, ein einfaches Stück Code zu schreiben, um Werte aus einer CSV-Datei mit maximal 100 Einträgen in ein Array von Strukturen zu lesen.
Beispiel für eine Zeile der CSV-Datei:
1, Mr., James, Quigley, Direktor, 200000,0
Ich verwende den folgenden Code, um die Werte einzulesen, aber wenn ich die Werte ausdrücke, sind sie falsch
%Vor%Wenn ich dann den Vornamen ausdrucke, werden alle Werte dem Vornamen zugeordnet:
%Vor% Gibt ames,Quigley,Director,200000,0
usw. auf diese Weise an. Ich bin mir sicher, dass ich so die fscanf Zeile formatiere, aber ich kann es nicht zum Laufen bringen.
Hier ist meine Struktur, in die ich lese:
%Vor% Dies liegt daran, dass eine Zeichenkette %s
das Komma enthalten kann, sodass sie in die erste Zeichenkette gescannt wird. Es gibt keine "Vorausschau" im Formatierungsbezeichner scanf()
. Die Tatsache, dass auf das Zeichen %s
ein Komma in der Formatspezifikationszeichenfolge folgt, bedeutet nichts.
Verwenden Sie Zeichengruppen (suchen Sie das Handbuch nach [).
%Vor% Und lernen Sie den Rückgabewert zu überprüfen, da E / A-Aufrufe fehlschlagen können! Verlassen Sie sich nicht darauf, dass die Daten gültig sind, es sei denn got
ist 7.
Damit Ihr Programm die gesamte Datei (mehrere Datensätze, z. B. Zeilen) liest, würde ich empfehlen, ganze Zeilen in einen (großen) Puffer fester Größe mit fgets()
zu laden und anschließend sscanf()
für diesen Puffer zu verwenden die Spaltenwerte. Das ist viel einfacher und wird sicherstellen, dass Sie wirklich getrennte Zeilen scannen, wobei fscanf()
in einer Schleife nicht aufgerufen wird, da zu fscanf()
ein Zeilenvorschub nur Leerzeichen ist.
Kann auch meinen Kommentar als Antwort posten:
%s
liest standardmäßig ein vollständiges Wort.
Er findet die %d
, den ganzzahligen Teil, dann die ,
und muss dann eine Zeichenkette lesen. ,
wird in einem Wort als gültig betrachtet (es ist kein Leerzeichen), also liest es bis zum Ende der Zeile (es gibt bis dahin kein Leerzeichen), nicht bis zum ersten Komma ... Und der Rest bleibt leer. (Aus dieser Antwort)
Sie müssen das Trennzeichen mit einem Regex ändern:
%Vor% Anstelle von %s
, benutze %[^,]
, was bedeutet "nimm alle Zeichen und stoppe, wenn ein ,
gefunden wurde".
BEARBEITEN
%[^,]s
ist schlecht, es würde nach dem Ende des Scansets ein Literal s
benötigt ... Danke @MichaelPotter
(Aus Ändern des Trennzeichens scanf () und Lesen von Werten aus der CSV-Datei in Variablen )