1

最初の2行のファイルを読みたい。プログラムは:

    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

2番目のfgetsに到達すると、segfaultエラーが生成されます。gdbを使用すると、2番目のfgetsでファイルポインタfpが0になることがわかりました。何が問題ですか?fgetsはこのように使用できますか?

4

2 に答える 2

3

fgets()結果を信頼する前に、それが成功することを確認する必要があります。

また、なぜあなたmemset()は両方の呼び出しをしているのですか、とにかくすべてがうまくいったときに上書きする必要がありますbufvalueそれはバグを引き起こします:

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

バッファサイズが間違っています。

于 2012-09-21T07:47:41.120 に答える
0

mainの最後で、fpを閉じるためにfclose()を呼び出す必要があります。memset()呼び出しは必要ありません。fgets()はbufの最後に「\0」を設定します。

于 2012-09-21T07:55:27.937 に答える