Sagen dies die Datei, die ich lesen will:Wie fscanf() verwendet wird, um Strings mit mehreren Formaten zu erhalten?
07983988 REMOVE String1
13333337 ADD String4 100
34398111 TRANSFER String5 String6 100
Diejenigen, die nur drei gültige Formattypen sind.
ich den folgenden Code-Block bin mit zu überprüfen, was das Format der Zeile analysiert:
// Read from file.
while (!feof(fd)) {
// Check for format.
if (fscanf(fd, "%d %s %s %s %lf", ×tamp, transaction_type_str, company1, company2, &value)) {
node_t *transaction = create_node((long int)timestamp, 1, company1, company2, value);
add_node(transactions, transaction);
} else if (fscanf(fd, "%d %s %s", ×tamp, transaction_type_str, company1)) {
node_t *transaction = create_node((long int)timestamp, 1, company1, NULL, 0);
add_node(transactions, transaction);
} else if (fscanf(fd, "%d %s %s %lf", ×tamp, transaction_type_str, company1, &value)) {
node_t *transaction = create_node((long int)timestamp, 1, company1, NULL, value);
add_node(transactions, transaction);
}
Dies jedoch ist mir eine Endlosschleife zu geben. Ich bin neu in der Datei I/O in C, und ich frage mich, ob es besser ist, eine tokenisierte Ansatz oder Linie basierte Format Suche Ansatz zu verwenden.
Das Problem mit 'fscanf()' ist es ist destruktiv. Sie müssen fast sicher 'fgets()' oder 'getline()' verwenden, um eine Zeile zu lesen, und dann eine Analyse mit 'sscanf()' durchführen. Dadurch können Sie es erneut versuchen, wenn die erste Analyse fehlschlägt. –
Ich benutze ANSI C, also nehme ich an, dass 'fgets()' meine einzige Option ist? –
Es hängt davon ab, was Sie mit "ANSI C" meinen. Wenn Sie bei C89/C90 stecken bleiben, tut es mir leid - Sie sollten C11 oder C99 verwenden können. Es hängt auch davon ab, ob das bedeutet "nur Funktionen definiert durch (die relevante Version von) der Norm" oder etwas anderes. Als Ausgangspunkt ist 'fgets()' jedoch das am zuverlässigsten verfügbare Werkzeug. Benutze es, um eine Zeile zu lesen: 'char puffer [4096]; while (fgets (buffer, sizeof (buffer), fd)! = 0) {... analysiere den Puffer mit sscanf() etc ...} '(nicht die Nichtbenutzung von' feof() '). –