2016-08-09 21 views
2

I C jetzt lerne und etwas Hilfe bei der folgenden benötigen:C - fscanf, Format ausgibt

ich als eine Eingabe erhalten eine Datei, wenn seine Zeilen im folgenden Format:

file1.h: file3.sas,file7.txt,name.lll,.. 

file4.f: file6.kgl,... 

... 

Ich versuche, von jeder Zeile den Namen der Datei zu erhalten (einschließlich ".h/.etwas").

So las ich über fscanf und versucht, es wie folgt zu verwenden:

fscanf(fpointer, "%[^:]", filesName); 

fscanf(fpointer, " %s", rest); 

Das Problem ist, dass filesName „fängt“, was ich will, und dann fängt die „Ruhe“, und immer rest nicht fangen etwas.

Beispiel für die Eingabe und Ausgabe:

Eingang einer Datei mit den folgenden Zeilen:

file1.h: gri.ad,adsd.eda 

file2.h: da.ad,dads.da 

Ausgang:

filesName: file1.h 

rest: : 

filesName: gri.ad,adsd.eda 

file2.h 

rest: : 

filesName: da.ad,dads.da 

rest: : 

Wo habe ich einen Fehler gemacht?

+2

fügen Sie bitte eine Eingabe Ausgabe Beispiel – DrPrItay

+0

@DrPrItay danke, ich tat. – Liad

Antwort

2

Der erste fscanf liest den Dateinamen und der zweite liest nur den Doppelpunkt (bis zum Leerzeichen). Dann wird der "Rest" als Teil des nächsten Dateinamens gelesen.

Versuchen Sie, diese

fscanf(fpointer, "%[^:]:", filesName); 
+0

danke für die antwort, der "rest" bleibt gleich? – Liad

+0

Wenn Ihr "Rest" keinen eingebetteten Leerzeichen hat, sollte es funktionieren, sonst brauchen Sie etwas anderes, um es zu lesen ... –

+0

ok, es scheint Teig zu sein - jetzt ist der Name der zweiten Datei in einer neuen Zeile, warum ist das? – Liad

0

Wenn Sie alle Dateinamen in den Dateien lesen wollen (was ich nehme an, Sie eigentlich tun wollen), packen Sie in eine Schleife zu lesen:

char buffer[256]; 
char c; 
int result; 
do 
{ 
    result = fscanf(file, "%255[^,]%c", buffer, &c); 
    if(result > 0) 
    { 
     printf("%s\n", buffer); 
    } 
} 
while(result > 1); 

Beachten Sie, dass ich die Puffergröße dem Paketparameter hinzugefügt habe, um die Puffergröße nicht zu überschreiten (die Größe kann leider nicht wie bei printf über * übergeben werden). Außerdem lese ich das Komma explizit als Zeichen ein, um das Schleifenende erkennen zu können (ich habe Komma verwendet, wie Sie es in Ihren Eingabe-Samples geschrieben haben, setzen Sie den Doppelpunkt wenn nötig ...).

0

Was ist Ihr Problem ist, Ihre reguläre Ausdrücke

% s liest bis zu einem Leerzeichen zu sein scheint - Raum/tab/Newline und so was passiert, im Grunde ist, dass Sie lesen gerade nach oben: nicht enthaltenen und% s erhalten die : innerhalb von ihm.

Versuchen Sie stattdessen

fscanf(fpointer, "%[^:]", fileName); // get everything up to :

fgetc(fpointer); // get rid of :

fgetc(fpointer); // get rid of space

fscanf(fpointer, "%[^\n]", rest); // get the entire line

Doch dies wie eine sehr unsichere Lösung erscheint mir die leicht boffed werden könnte Lesen Sie mehr über reg Ular Ausdrücke und scanf, um bessere Lösungen zu finden