2016-11-13 3 views
1

Ich versuche herauszufinden, warum dies nicht druckt, ich versuche jeden Buchstaben aus einer Textdatei zu drucken, die über die Eingabeaufforderung eingegeben wird, aber ich bekomme nur eine leere Ausgabe ... Was mache ich falsch und warum funktioniert das nicht? Ich denke, das sollte logisch funktionieren. Vielen Dank.Text wird nicht am Ausgang gedruckt

int main(int argc, char *argv[]) { 
    FILE *fp; 
    int i; 
    for (i = 1; i < argc; i++) { 
     printf("%s\n", argv[i]); 
     fp = fopen(argv[i], "r"); 
     while (!feof(fp)) { 
      puts(fp); 
     } 
     fclose(fp); 
    }  
    return 0; 
} 
+1

Siehe http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong –

+1

Wie dem auch sei - 'fp' ist zum Lesen so' puts' macht keinen Sinn –

+0

Sie lesen nicht aus irgendeiner Datei 'puts (fp)' ist Unsinn - es ist der Dateizeiger. Überprüfen Sie zuerst, ob das 'fp'-Ergebnis von' fopen' nicht 'NULL' ist. Dann lies aus der Datei. Aber Sie haben noch nirgends zu lesen. –

Antwort

1

Sie versuchen, einen Dateizeiger zu drucken:

puts(fp); 

Lesen Sie das Handbuch von puts() -Das ist nicht das, was es braucht.

Um char-by-char und Druck auf dem stdout zu lesen, die Sie tun können:

int ch; 
fp = fopen(argv[i], "r"); 
if (!fp) { 
    perror("fopen"); 
    exit(1); 
} 
while((ch=fgetc(fp)) != EOF) { 
    putchar(ch); 
} 
flcose(fp); 

Sofern Sie mehrere Dateinamen als Argumente zu übergeben sind, wird Ihre äußere Schleife nicht viel Sinn machen.

+0

Oh ok, das macht total Sinn, danke. Ich glaube, ich habe einen Dateizeiger mit einem Char-Zeiger verwechselt. Ich bin immer noch verwirrt über den Unterschied: Wenn ein Dateizeiger auf das erste Zeichen in der Datei zeigt, ist das nicht auch was ein Char-Zeiger tut? – Submersed24

+0

Sie möchten auch [this] (http://stackoverflow.com/questions/5431941/why-is-which-feof-file-always-wrong) lesen, um zu wissen, während (! Feof (fp)) 'nicht ist was du in den meisten Anwendungsfällen willst. –

+0

Ich habe gerade was gesagt und immer noch keine Ausgabe, auch, ja, ich bin für das Wort Häufigkeit von mehreren Dateien testen. – Submersed24

1

Ihr Programm hat mehrere Probleme:

  • Sie testen nicht den Rückgabewert von fopen(): das Programm nicht definiertes Verhalten ruft nicht als Stream zum Lesen geöffnet werden, wenn eine der Befehlszeilenargumente kann.

  • while(!feof(fp)) ist falsch. Lesen Sie dazu: Why is “while (!feof (file))” always wrong?

  • puts(fp); falsch ist wie fp ein FILE * ist, kein String. Verwenden Sie eine Schleife, um den Dateiinhalt jeweils um ein Byte zu kopieren.

Hier ist eine korrigierte Version:

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

int main(int argc, char *argv[]) { 
    FILE *fp; 
    int i, c; 

    for (i = 1; i < argc; i++) { 
     fp = fopen(argv[i], "r"); 
     if (fp == NULL) { 
      fprintf(stderr, "cannot open %s: %s\n", argv[i], strerror(errno)); 
     } else { 
      printf("%s\n", argv[i]); 
      while ((c = getc(fp)) != EOF) { 
       putchar(c); 
      } 
      fclose(fp); 
     } 
    }  
    return 0; 
} 
0
int main(int argc, char *argv[]) { 
    FILE *fp; 
    int i; 
    char buff[128]; 
    for (i = 1; i < argc; i++) { 
     printf("\n%s\n", argv[i]); 
     if(NULL == (fp = fopen(argv[i], "r"))){//check open file 
      perror("fopen"); 
      continue; 
     } 
     while (fgets(buff, sizeof buff, fp)) {//read into buffer 
      fputs(buff, stdout);//print buffer (not add newline) 
     } 
     fclose(fp); 
    }  
    return 0; 
}