2017-01-15 7 views
-1
#define MAX_READING 100; 

char str_orders[MAX_READING], str_books[MAX_READING], 
    books_updated[MAX_READING], *token, *token1, p[MAX_READING], 
    File * books_orders, *books, books_updated; 

while (fgets (str_orders, MAX_READING, books_orders) != NULL) { 
    if (str_orders[strlen (str_orders) - 1] == '\n') 
     str_orders[(strlen (str_orders) - 1)] = 0; 
    if (strcmp (str_orders, "Initialize") == 0) { 
     while (fgets (str_books, MAX_READING, books) != NULL) { 
      if (str_books[strlen (str_books) - 1] == '\n') 
       str_books[(strlen (str_books) - 1)] = 0; 
      token = strtok (str_books, "$$$"); 
      strcpy (p, token); 
      token = strtok (NULL, "$$$"); 
      copy = atoi (token); 
      add (head, p, copy); 
     } 
    } 
    printf ("%s\n", str_orders); 
    if (strcmp (str_orders, "Initialize") != 0 
     && strcmp (str_orders, "Finalize") != 0) { 
     token1 = strtok (str_orders, "$$$"); 
     strcpy (order, token1); 
     token1 = strtok (NULL, "$$$"); 
     strcpy (book_name, token1); 
     token1 = strtok (NULL, "$$$"); 
     copy = atoi (token1); 
     if (strcmp (order, "Return") == 0) 
      returnbook (head, book_name, copy); 
     if (strcmp (order, "Borrow") == 0) 
      borrowbook (head, book_name, copy); 
     if (strcmp (str_orders, "Finalize") == 0) { 
      while (head != NULL) { 
       fprintf (books_update, "%s", head->name); 
       fprintf (books_update, " $$$ "); 
       fprintf (books_update, "%d", head->copies); 
      } 
     } 
    } 

Ich versuche, Zeile für Zeile aus einer txt-Datei zu lesen in C. ich die fgets Funktion verwendet, um sie zu lesen, aber die Funktion liest die erste Zeile „Intalize“ genannt, gehen keine anderen Linien in der Datei. Ich habe versucht,Wie wird zeilenweise aus einer Datei gelesen?

printf("%s",str_orders) 

und es gibt "Intalize" zurück. Die fgets ging nicht zu den Zeilen.

Wie kann ich das beheben?

+4

Mögliche Duplikat [C lesen Datei Zeile für Zeile] (http://stackoverflow.com/questions/3501338/c-read-file-line-by-line) – Unimportant

+3

Dieser Code wird nicht kompiliert. Nicht annähernd. Bitte geben Sie eine [MCVE] an. –

Antwort

0

So würde ich gehen, um eine Datei Zeile für Zeile zu lesen.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

// Read a line from the file and put it into the buffer, and return 1 if we're at the end of the file 
int readLine(FILE *file, char *buffer, int bufferLength) { 
    int bufferPosition = 0; 

    while (true) { 
     // Copy the character into the buffer 
     buffer[bufferPosition] = fgetc(file); 

     if (feof(file)) { 
      // Return 1 if we're at the end of the file 
      buffer[bufferPosition] = 0; 
      return 1; 
     } else if (buffer[bufferPosition] == '\n') { 
      // Return if we're at the end of a line 
      buffer[bufferPosition] = 0; 
      return 0; 
     } else { 
      // Go to the next character 
      bufferPosition++; 
      if (bufferPosition == bufferLength) { 
       // If we fill up the buffer, exit here 
       buffer[bufferPosition - 1] = 0; 
       break; 
      } 
     } 
    } 

    return 0; 
} 

int main(int argc, char **argv) { 
    FILE *file = fopen("file.txt", "rb"); 

    int lineNumber = 1; 
    char line[4096]; 
    while (true) { 
     int read = readLine(file, line, sizeof(line)); 
     printf("Line %d: %s\n", lineNumber++, line); 
     if (read) break; // The end of the file 
    } 

    fclose(file); 
    return 0; 
} 
+0

readLine() gibt keinen Fehler zurück. Es gibt 1 zurück, wenn das Ende der Datei erreicht wurde. Die Methode bedeutet, dass ein beliebiger Text in der letzten Zeile der Datei gedruckt wird, da wir nicht wissen, ob die Datei mit einem Zeilenvorschubzeichen endet. – bace1000

+0

Jungs! I, die auf Problem gepostet haben, bitte antworte mir :) –

+0

In deinem Code überschreibst du 'str_orders' bei jedem Aufruf von' fgets'. Sie benötigen ein * Array von Strings * oder einen * Pointer to pointer to char *, die Sie inkrementieren können, um eine neue Adresse für 'fgets' bereitzustellen, die bei jeder Iteration gefüllt werden soll (z. B. str_orders [i ++]') –

Verwandte Themen