2016-05-31 4 views
0

So vermeiden Sie, Semikolon zu lesen; in FILE und speichern sie in Variable?Wie ignoriere ich ';' in einer Datei wenn fscanf?

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
int main(void) 
{ 
char gstitem[6], gstname[30],; 
int gstquant, itemquant; 
float gstprice; 

char string[10]; 
printf("Purchase items fuction\n\n"); 
FILE *gstPtr; //pointer to the gst.txt 
gstPtr = fopen ("gst.txt", "r+"); 
printf("Enter an item code: "); 
fgets(string,10,stdin); 
(!feof(gstPtr)); 
{ 

    fscanf(gstPtr,"%[^;]s %[^;]s %[^;]f %[^;]d\n",gstitem,gstname,&gstprice,&gstquant); 
    printf("%s %s %f %s\n",gstitem,gstname,gstprice,gstquant); 
    } 
fclose(gstPtr); 
} 

Dies ist die Datei, die i vv

gst.txt

+0

Ihr Bild ist eine kleine Menge an Text: bitte per Post als Text als Teil der Frage. Die Idee des [Minimalen, Kompletten und Verifizierbaren Beispiels] (http://stackoverflow.com/help/mcve) ist, dass Leser den Code und seine Eingabedaten kopieren und ausprobieren können. –

+1

Nicht das Ergebnis von 'fscanf()' ist das [_Road to Perdition_] (http://www.dictionary.com/browse/perdition), – chux

+0

Was ist der Zweck von 'fgets' vor der Schleife? Und was ist die Schleifenkontrolle '(! Feof (gstPtr));' [sic] soll das sein? Abgesehen davon, dass man bei der Verwendung von 'feof' vorsichtig ist (http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong), ist die Art und Weise, wie man die Schleife kontrolliert, die Rückkehr Wert von 'fscanf', wie' while (fscanf (...) == 4) {...} ' –

Antwort

3

Probleme mit dem Format-String fscanf wollen:

  1. Wenn Sie das %[^;] Formatbezeichner verwenden, sollten Sie nicht fügen Sie dazu s hinzu. Es wird vorausgesetzt, dass die erwarteten Daten eine Zeichenfolge sind.

  2. Die Verwendung von %[^;] ohne Angabe einer Breite kann dazu führen, dass mehr Daten gelesen werden, als Ihre Variable speichern kann. Geben Sie immer die maximale Anzahl von Zeichen an, die Sie lesen möchten.

  3. Verwendung von %[^;]d und %[^;]f erlaubt Ihnen nicht, ein int und ein float zu lesen.

  4. Vermeiden Sie die Verwendung von \n im Formatzeichenfolge. Das führt dazu, dass fscanf alle Zeichen bis zum nächsten Nicht-Leerzeichen gelesen und gelöscht werden. Es liest nicht nur den Zeilenumbruch. Es ist besser, eine weitere Zeile hinzuzufügen, um alles bis zum Zeilenumbruch zu überspringen.

Verwendung:

fscanf(gstPtr,"%5[^;];%29[^;];%f;%d",gstitem, gstname, &gstprice, &gstquant); 
int c; 
while ((c = fgetc(gstPtr)) != EOF && c != '\n'); 
+2

verarbeiten Unbegrenzte Weitenbezeichner wie' "% [^;]" 'sind ungefähr so ​​gut wie' gets() '. – chux

+1

@chux, in der Tat. Danke für den Zeiger. –

Verwandte Themen