2017-03-03 3 views
0

J'ai un programme fictif qui écrit quelques caractères dans un fichier:C - fread ombles de fichier

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; 
} 

Et un autre programme dans lequel je dois lire ce fichier, voici un 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 

Je veux lire les caractères "offset" à partir de la position "posicio". "resposta" est un tableau de 500 caractères.Le temps que vous pouvez voir dans le deuxième programme est parce que je suis désespéré, quand j'exécute le deuxième programme, dans la console apparaît un tas de symboles tels que: xMh dans le dernier printf. J'ai essayé de lire octet à octet dans le temps, mais il ne cesse de m'obtenir ces symboles, je ne sais pas ce que cela peut faire, mon premier soupçon était que j'étais en quelque sorte l'ouverture du fichier en mode binaire, mais Nan!

+1

Ignorer le 1er programme. Mettez du texte brut dans "num.txt" et testez le 2ème programme avec ça. Vérifiez que vous obtenez ce qui est dans le fichier. Cherchez-vous passé la fin du fichier? Vérifiez la valeur de retour de fread(), elle doit être égale à . – Kingsley

+0

J'ai besoin de la fseek, je ne veux pas commencer à lire depuis le début.Et du texte normal je continue à obtenir les mêmes sorties incorrectes – Asdemuertes

+0

Qu'essayez-vous d'atteindre avec le (j% 27 == 0) - boucle de la lettre je reviens à un moment donné? – Kingsley

Répondre

1

C'est donc une nouvelle écriture de votre premier programme avec une belle mise en forme

#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; 
} 

Et

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]); 
     } 

    } 
} 

Notez que dans votre extrait de code # 2, vous ouvrez le fichier avec le handle dans la variable '' num '', mais en lisant ensuite depuis le handle '' fp ''. Est-ce exprès? Cela ressemble à un bug, mais c'est difficile à dire d'ici.

+0

Merci, en effet, c'était un bug. Mais maintenant je reçois le problème "trop ​​de fichiers ouverts" – Asdemuertes

+1

Ah oui - j'ai oublié le fclose(). Si jamais vous avez trop de fichiers ouverts, vous l'avez oublié aussi. – Kingsley

+0

BTW: J'ai ajouté ce fflush() parce que je suppose que vous consommez le fichier dans un fil ou un processus séparé que vous lisez. Sans le vidage, vous ne pouvez pas vraiment savoir si/quand le fichier a été écrit par le système d'exploitation. – Kingsley