c - 从中​​文件

问题描述:

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

因此,这是你的第一个程序的一些不错的格式重新写入

#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