2010-03-03 18 views
10

Welche Methode kann verwendet werden, um jeweils eine Zeile aus einer Datei in C zu lesen?Zeile für Zeile lesen in C

Ich verwende die fgets Funktion, aber es funktioniert nicht. Es wird nur das durch Leerzeichen getrennte Token gelesen.

Was ist zu tun?

+0

Also wollen Sie nicht wirklich eine Zeile lesen, möchten Sie, bis ein Platz lesen, anzutreffen ist? Oder sagst du, dass Fgets auf Leerzeichen statt auf Zeilenumbrüchen stoppt? –

+0

sollte nur bei neuen Zeilen Zeichen stehen bleiben. –

+0

Hier ist mein Eingang :: START A DC 10 B DS 20 STOPP Ich habe :: START A B STOPP als meine Ausgabe .. –

Antwort

12

Dies sollte funktionieren, wenn Sie aus irgendeinem Grund fgets() nicht verwenden können.

int readline(FILE *f, char *buffer, size_t len) 
{ 
    char c; 
    int i; 

    memset(buffer, 0, len); 

    for (i = 0; i < len; i++) 
    { 
     int c = fgetc(f); 

     if (!feof(f)) 
     { 
     if (c == '\r') 
      buffer[i] = 0; 
     else if (c == '\n') 
     { 
      buffer[i] = 0; 

      return i+1; 
     } 
     else 
      buffer[i] = c; 
     } 
     else 
     { 
     //fprintf(stderr, "read_line(): recv returned %d\n", c); 
     return -1; 
     } 
    } 

    return -1; 
} 
+0

thankbuddy seine Wokring aber immer noch habe ich ein Problem .. Mein Puffer liest und speichert gesamte Zeile aber während des Druckens nur erster Raum separted Token nur –

+0

das ist seltsam, kann ich 'printf („% s \ n“, Puffer) nur,' und es gibt den ganzen Puffer – LukeN

+0

yeh, seine seltsam für mich auch. weil es für alle bisherigen Programme arbeitet ...: '( –

2

fgets() sollte der Weg zu gehen ...

+0

solange der Puffer groß genug ist, um – Tom

+0

Tom : Das ist der zweite Parameter, um zu vermeiden, dass der Puffer überläuft. Oder meinen Sie nicht, einen Puffer groß genug zu haben? IIRC, mein C-Compiler hat ein 512-Byte-Limit für einzelne Zeilen. –

+0

Welcher C-Compiler ist das ?. Und ich denke an den Fall, wo Sie nicht wissen, wie lange die Leitung ist, z. B. Stdin. Nicht versuchen, einen heiligen Krieg damit zu beginnen. – Tom

7

Die fgets Funktion eine einzelne Zeile aus einer Datei oder num Zeichen gelesen werden, wo num der zweite Parameter zu fgets geben wird. Übergeben Sie eine ausreichend große Nummer, um die Zeile zu lesen?

Für Beispiel

// Reads 500 characters or 1 line, whichever is shorter 
char c[500]; 
fgets(c, 500, pFile); 

Vs.

// Reads at most 1 character 
char c; 
fgets(&c,1,pFile); 
+0

ja. meine Pufferlänge ist 100. Also ich denke, seine ausreichend .. –

+0

falsche Deklaration von Array-Variablen! – t0mm13b

+0

@JaredPar: Cool! Du hast es repariert! : Hey P, I upvoted nach von 0 bis -1 Downvoting, dann upvoted, wie Sie es behoben, um es bis auf Null zurückbringen, anstatt es auf 1 sprang ... ist, dass mein Browser oder eine Panne? – t0mm13b

2

Verwendung entweder fgets, wenn Sie wissen, dass Ihre Zeilen in den Puffer passt oder fgetc über das Lesen für mehr Kontrolle verwenden

3

Dies ist eher ein Kommentar als eine vollständige Antwort, aber ich habe nicht genug Punkte zu kommentieren. :)

Hier ist der Funktionsprototyp für fgets():

char *fgets(char *restrict s, int n, FILE *restrict stream); 

Es wird n-1 Bytes oder bis zu einem Newline oder EOF lesen. Für weitere Informationen siehe here

2

fgets Gebrauch von der Linie zu lesen, und dann getc(...) verwenden Sie das Newline oder End-of-line zu kauen weiter zu lesen .... hier ist ein Beispiel für immer eine Zeile zu lesen ...

 
// Reads 500 characters or 1 line, whichever is shorter 
char c[500], chewup; 
while (true){ 
    fgets(c, sizeof(c), pFile); 
    if (!feof(pFile)){ 
     chewup = getc(pFile); // To chew up the newline terminator 
     // Do something with C 
    }else{ 
     break; // End of File reached... 
    } 
} 
16

Verwenden Sie das folgende Programm, um Zeile für Zeile aus einer Datei abzurufen.

#include <stdio.h> 
int main (void) 
{ 
    char filename[] = "file.txt"; 
    FILE *file = fopen (filename, "r"); 

    if (file != NULL) { 
    char line [1000]; 
    while(fgets(line,sizeof line,file)!= NULL) /* read a line from a file */ { 
     fprintf(stdout,"%s",line); //print the file contents on stdout. 
    } 

    fclose(file); 
    } 
    else { 
    perror(filename); //print the error message on stderr. 
    } 

    return 0; 
} 
0

Fehlerquelle:

Eigentlich war es nicht meine Schuld .. In diesem Fall. Ich verwendete strtok Funktion und und änderte versehentlich meine ursprüngliche ursprüngliche Schnur. daher während des Druckens ich den Fehler war immer ...

Vielen Dank allen für mich zu helfen .. :)

-1

Sie können fscanf statt fgets verwenden. Weil fgetscan für Zeichen einschließlich Leerzeichen verwendet wird, aber während Sie fscanf verwenden, können Sie separat auf Daten zugreifen, die in einer Datei gespeichert sind. Beispielsweise gibt es eine Datei mit der Namensklasse roll.Deklarieren Sie jetzt eine Zeichenfolge und zwei Ganzzahlen.