为什么在执行第二个fgets时,我在C中的文件指针变为空?

时间:2012-09-21 07:44:50

标签: c file-io fgets

我想读一个文件,前两行。该计划是:

    int main(void)
    {
      FILE *fp;
      char buf[1024];
      char value[128];
      long mem[2];
      char *pos;

      if (!(fp = fopen("example.txt", "r"))) {
        printf("CANNOT open example.txt\n");  
        return -2;
      }


      for(int i = 0; i < 2; ++i) {
        fgets(buf, 1024, fp);
        pos = strstr(buf, ":");
        if (!pos) {
            printf("MEMINFO wrong format\n");
            return -1;
        }

        strncpy(value, pos + 1, 128);
        mem[i] = atol(value);

        memset(buf, 0, sizeof(buf));
        memset(value, 0, sizeof(buf));
      }

} 

和example.txt类似:

MemTotal:        3541412 kB
MemFree:          123500 kB
Buffers:           11372 kB
Cached:          2582072 kB
SwapCached:         1520 kB
Active:          1832328 kB
Inactive:        1493348 kB
Active(anon):    1608692 kB
Inactive(anon):  1269620 kB
Active(file):     223636 kB

达到第二个fgets时会产生段错误。使用gdb,我发现文件指针fp在第二个fgets中变为0。问题是什么?可以像这样使用fgets吗?

2 个答案:

答案 0 :(得分:3)

在依赖结果之前,您需要检查fgets()是否成功。

此外,为什么要进行memset()来电,bufvalue都应该在一切顺利时被覆盖。它会导致错误:

 memset(value, 0, sizeof(buf));

错误的缓冲区大小。

答案 1 :(得分:0)

在main结束时,你需要调用fclose()来关闭fp。 不需要memset()调用。 fgets()设置&#39; \ 0&#39;在buf结束时。