1

我想读取一个文件,前两行。程序是:

    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可以这样使用吗?

4

2 回答 2

3

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

另外,你为什么要memset()打电话,不管怎样bufvalue当一切顺利时都应该被覆盖。它会导致一个错误:

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

缓冲区大小错误。

于 2012-09-21T07:47:41.120 回答
0

At the end of main, you need to call fclose() to close fp. The memset() calls are not needed. fgets() set '\0' at the end of buf.

于 2012-09-21T07:55:27.937 回答