2010-04-27 9 views
6

Ich versuche, eine Datei mit Trennzeichen zu lesen. voller Phrasen.Wie liest man eine Zeichenfolge aus einer getrennten Datei?

Ich versuche, jede Phrase in eine Zeichenfolge zu setzen.

Das Problem ist, dass wenn ich versuche, die Datei zu lesen mit

fscanf(file,"%50s\n",string); 

die Zeichenfolge nur ein Wort enthält. wenn es mit einem Leerzeichen zusammensticht, hört es auf, die Zeichenfolge zu lesen

Antwort

2

fscanf kann geändert werden, um frühere Leerzeichen zu lesen. Die Details sind ein bisschen kompliziert. Hier ist, was der Mann sagt Seite über% [...]

Spiele eine nicht leere Folge von Zeichen aus dem angegebenen Satz von akzeptiert Zeichen; der nächste Zeiger muss ein Zeiger auf char sein, und dort muss genug Platz für alle Zeichen in der Zeichenfolge plus ein beenden NUL-Zeichen sein. Der übliche Sprung des führenden Leerzeichens ist unterdrückt. Die Zeichenkette ist aus Zeichen in (oder nicht in) einem bestimmten Satz zu machen; Der Satz wird definiert durch die Zeichen zwischen der offenen Klammer [Zeichen und eine enge Klammer] Zeichen. Der Satz schließt diese Zeichen aus, wenn das erste Zeichen nach der offenen Klammer ein Zirkumflex^ist. Um eine enge Klammer in den Satz aufzunehmen, machen Sie es zum ersten Zeichen nach der offenen Klammer oder der Zirkumflex; jede andere Position wird den Satz beenden. Der Bindestrich Zeichen - ist auch besonders; Wenn zwischen zwei anderen Zeichen platziert wird, fügt alle dazwischenliegenden Zeichen zu dem Set hinzu. Um einen Bindestrich einzufügen, geben Sie das letzte Zeichen vor der abschließenden Klammer ein. Zum Beispiel `[^] 0-9-] 'bedeutet die Menge` `alles außer schließen Klammer, Null bis neun, und Bindestrich' '.Die Zeichenfolge endet mit dem Aussehen eines Zeichens nicht in der (oder mit einem Zirkumflex, in) Set oder wenn die Feldbreite abläuft.

Also,% [^ \ n] sollte alles bis zum Wagenrücklauf lesen.

+2

Es liest alles bis zum Newline aber * nicht * der Newline selbst. Wenn Sie 'fscanf (Datei,"% [^ \ n] ")' loopen, erhalten Sie immer wieder die leere Zeichenfolge. Sie müssen den Zeilenumbruch entweder mit einem Leerzeichen in der Formatzeichenfolge oder etwas wie "% * c" verwenden. –

+0

Danke das ist es. –

+0

@Adam Gute Punkte. Die oben genannte Antwort ist auch sicherer für Pufferüberlauffehler. –

3

fscanf mit %s hört auf zu lesen, wenn es Leerzeichen findet.

Da Sie unformatierten Text lesen, können Sie einfach fgets verwenden, das liest, bis es den Puffer füllt, den Sie es geben, es findet eine neue Zeile (\n), oder es erreicht das Dateiende, je nachdem was zuerst eintritt.

+0

Das funktioniert komisch. Es liest nicht jede Zeile. und jeder String endet in \ 0 endet in \ n –

+1

Jeder String endet immer noch in "\ 0'", aber das letzte Zeichen davor ist normalerweise "\ n", da es die Zeile genau so einliest erscheint in der Datei. Wenn das Zeichen "\ n" fehlt, bedeutet dies entweder, dass Ihr Puffer nicht groß genug für die gesamte Zeile war, oder dass Sie nur die letzten Zeichen in der Datei gelesen haben und sie nicht mit einem Zeilenumbruch beendet wurde. – caf

5
fscanf(file,"%50[^\n]\n",string); 
  1. Jedes Zeichen außer \n wird von [^\n]

  2. Maximum 0f 50 Zeichen wird verbraucht (machen muss sicher String Platz für 51 atleast)

  3. ..\n verzehrt werden ",string dies stellt sicher, dass \n auch verbraucht wird, so dass die ne xt-Aufruf gibt nicht nur eine leere Zeichenfolge zurück.

+0

das funktioniert super, Danke –

2

Avoid using scanf. Wie bereits erwähnt, sollten Sie stattdessen fgets verwenden.

Wenn Sie keinen Puffer fester Größe verwenden und Zeilen beliebiger Länge zulassen möchten, können Sie versuchen, Chuck Falconer's public domain ggets function zu verwenden. (Diese Verbindung scheint nach unten jetzt zu sein, aber archive.org has a copy.)

+0

@Zenikoder: Wow, du hast die Schwierigkeit durchgemacht, einen der Beiträge, die 'ggets' erwähnen, zu verwerfen? Egal, was Sie von CBFalconers Verstand halten, sollten Sie den Code und nicht den Autor beurteilen. Wenn Sie spezifische Beschwerden gegen die "ggets" -Implementierung haben, ist das okay, aber ich denke nicht, dass es fair ist, das zu verwerfen, nur weil Sie den Typ nicht mögen. – jamesdlin

-1

intially Daten senden Payload_ID mit 00 01 02 03 .... 10

Verwendung

char * pChar = ""; // für die String-Erfassung.

fprintf (fp1, "% s", strtok (pChar, "Payload_ID"));

+0

hier Payload_ID ist das Trennzeichen, das Sie angeben können –