2017-03-03 9 views
0

Ich habe ein Dummy-Programm, das einige Zeichen in einer Datei schreibt:C - fread Saibling aus Datei

int main (int argc, char **argv) 
{ 
    char i = '0'; 
    int j = 0; 
    FILE * fp = NULL; 

    fp = fopen("num.txt","w+"); 
    if(!fp){ 
     printf("fopen failed\n"); 
     return -1; 
    } 
    fseek(fp, SEEK_SET, 0); 

    while(1){ 
     if (j >500) { 
      fclose(fp); 
      return 0; 
     } 
     usleep(5000); 
     fwrite(&i,sizeof(char),1,fp); 
     if (j%27 ==0) { 
      i ='0'; 
     } 
     i++; 
     j++; 
    } 
    fclose(fp); 
    return 0; 
} 

Und ein anderes Programm, in dem ich aus dieser Datei lesen muß, ist hier ein Fragment:

if ((num = fopen("num.txt", "r+")) == NULL){ 
    perror("Error al obrir l'arxiu"); 
} 

fseek(num, posicio, SEEK_SET); 
fread(resposta, sizeof(char), offset, fp); 
while(contador <500){ 
    printf("%c",resposta[contador]); 
    contador++; 
} 
printf(" la resposta contiene %s \n",resposta);A 

Ich möchte "Offset" Zeichen von der Position "Posicio" lesen. "Resposta" ist ein Array von 500 Zeichen. Während Sie im zweiten Programm sehen können, weil ich verzweifelt bin, wenn ich das zweite Programm ausführen, in der Konsole erscheint eine Reihe von Symbolen wie: xMh in der letzten drucken

Ich habe versucht, Byte zu Byte in der Weile zu lesen, aber es bringt mir diese Symbole, ich weiß nicht, was das tun könnte, mein erster Verdacht war, dass ich irgendwie die Datei im Binärmodus öffnete, aber Nee!

+1

Ignorieren des 1. Programms. Schreiben Sie einen einfachen Text in "num.txt" und testen Sie das 2. Programm damit. Stellen Sie sicher, dass Sie wissen, was in der Datei enthalten ist. Suchst du nach dem Ende der Datei? Überprüfen Sie den Rückgabewert von fread(). Er sollte entsprechen. – Kingsley

+0

Ich brauche den fseek, ich möchte nicht von Anfang an zu lesen beginnen. Und vom normalen Text bekomme ich immer die gleichen falschen Ausgaben – Asdemuertes

+0

Was versuchen Sie mit dem (j% 27 == 0) - Schleifen des Briefes zu erreichen ich zurück zu einem gewissen Punkt? – Kingsley

Antwort

1

Das ist also ein Umschreiben des ersten Programms mit einigen netten Formatierung

#include <stdio.h> 
#include <unistd.h> 

int main(int argc, char **argv) 
{ 
    char i = '0'; 
    int j = 0; 
    FILE *fp; 

    fp = fopen("num.txt", "w+"); 
    /*fseek(fp, SEEK_SET, 0); - NOT NEEDED*/ 

    if (fp != NULL) 
    { 
     for (j=0; j<500; j++) 
     { 
      usleep(5000); 

      fwrite(&i, sizeof(char), 1, fp); 
      fflush(fp); 

      if (j % 27 == 0) 
       i = '0'; 

      i++; /* could be put in the for() loop header */ 
     } 
     fclose(fp); 
    } 

    return 0; 
} 

Und

void readBlock(int posicio, int offset, char *resposta) 
{ 
    int i; 
    FILE *num = fopen("num.txt", "r+"); 

    if (num != NULL) 
    { 
     /* reposition to <posicio> bytes from the start of the file */ 
     fseek(num, posicio, SEEK_SET); 

     /* read <offset> bytes from that position */ 
     fread(resposta, sizeof(char), offset, num); 

     fclose(num); 

     /* dump out the bytes */ 
     for (i=0; i<offset; i++) 
     { 
      printf("%c", resposta[i]); 
     } 

    } 
} 

Beachten Sie, dass in Ihrem Code-Snippet # 2, sind Sie die Datei öffnen mit das Handle in der Variablen '' num '', aber dann vom Handle '' fp '' lesen. Ist das absichtlich? Es sieht wie ein Fehler aus, ist aber schwer von hier zu sagen.

+0

Danke zu lesen, in der Tat war das ein Fehler. Aber jetzt bekomme ich das Problem "zu viele offene Dateien" – Asdemuertes

+1

Ah yep - Ich habe die fclose() vergessen. Wenn Sie zu viele offene Dateien haben, haben Sie dies auch vergessen. – Kingsley

+0

BTW: Ich habe das fflush() hinzugefügt, weil ich nehme an, dass Sie die Datei in einem separaten Thread oder Prozess verbrauchen, während Sie es lesen. Ohne den Flush können Sie nicht wirklich wissen, ob/wann die Datei vom Betriebssystem geschrieben wurde. – Kingsley