我想读一个文件,前两行。该计划是:
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吗?
答案 0 :(得分:3)
在依赖结果之前,您需要检查fgets()
是否成功。
此外,为什么要进行memset()
来电,buf
和value
都应该在一切顺利时被覆盖。它会导致错误:
memset(value, 0, sizeof(buf));
错误的缓冲区大小。
答案 1 :(得分:0)
在main结束时,你需要调用fclose()来关闭fp。 不需要memset()调用。 fgets()设置&#39; \ 0&#39;在buf结束时。