2017-03-03 66 views
0

FREAD字符我有一個​​虛擬的計劃,在一個文件中寫入一些字符:c - 從中​​文件

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

而另一個程序中,我需要從文件中讀取,這裏是一個片段:

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 

我想從位置「posicio」讀取「偏移」字符。 「resposta」是500個字符的數組。當你在第二個程序中看到的是因爲我很絕望,當我執行第二個程序時,在控制檯中出現了一堆符號,例如:xMh 在最後的printf。

我試圖在字節中讀取字節,但它不斷讓我看到這些符號,我不知道可能會這樣做,我的第一個懷疑是我以某種方式以二進制模式打開文件,但不!

+1

忽略第一個程序。將一些純文本放入「num.txt」中,並用此測試第二個程序。確認你正在獲取文件中的內容。你是否正在尋找文件的結尾?檢查fread()的返回值,它應該等於。 – Kingsley

+0

我需要的fseek,我不想從頭開始閱讀。從正常的文本我一直得到相同的不正確的輸出 – Asdemuertes

+0

你試圖實現與(j%27 == 0) - 循環的信我回到了一些點? – Kingsley

回答

1

因此,這是你的第一個程序的一些不錯的格式重新寫入

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

而且

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

    } 
} 

注意,在您的代碼段#2,你用打開文件變量「num」中的句柄,然後從句柄「fp」中讀取。這是故意的嗎?它看起來像一個bug,但很難從這裏說出來。

+0

謝謝,確實這是一個錯誤。但現在我得到的問題「太多打開的文件」 – Asdemuertes

+1

啊是的 - 我忘了fclose()。如果你有太多打開的文件,你也會忘記。 – Kingsley

+0

順便說一句:我添加了fflush(),因爲我假設你正在讀取文件在一個單獨的線程或進程中。如果沒有刷新,您無法真正瞭解是否/何時該文件已被操作系統寫入。 – Kingsley