我正在從fgets中獲取細分,但有時只是。這是別人的代碼,我不懂makefile,所以我用printf語句進行調試......我把它放在主函數的兩個部分:(我只創建變量* f並且只寫一行,但是我FOPEN和FCLOSE文件兩次)fgets上的segfault ...有時
FILE *f = NULL;
char line[1000];
if ((f=fopen(filename,"r+"))==NULL)
{
printf("Error opening file\n");
f=0;//...handle error... //(usually just call abort() or return -1
}
//f = rfopen(fname, "r+");
printf("f from eval_args: %d, filename %s\n",f,filename);
printf("trying to read from file...\n");
printf("%s\n",fgets(line, sizeof (line), f));
printf("...succeeded\n");
fclose(f);
這給了我兩個不同的輸出:
f from eval_args: 4609600, filename /correct/path/to/file
trying to read from file...
100
...succeeded
f prior to entering density profile: 4609600, filename /correct/path/to/file
trying to read from file...
Segmentation fault (core dumped)
我檢查文件被正確打開,謹防閱讀更多的字符比將適合'線'。我在一個論壇上看到,文件名不應超過49個字符......但a)這是一個奇怪的限制,以及b)爲什麼它第一次工作?
有誰知道我還能檢查什麼?
沒有的printf()打印'(空)'當遇到一個空字符串是否? – 2012-03-27 13:42:37
你能發佈一個能夠重現問題的小型可編譯程序嗎? – hmjd 2012-03-27 13:46:58
首先,你應該把'fgets'作爲一個單獨的語句,然後你應該使用調試器來幫助你定位和檢查錯誤。 – 2012-03-27 13:47:27