簡體   English   中英

c-fscanf分段錯誤

[英]c - fscanf segmentation fault

fscanf真的很奇怪。 似乎找不到文件。 這是代碼:

char obs_file[255];
FILE *obs_fp;

strcpy(obs_file, "/aber/dap/cetaceans/data/observers_1.txt");

obs_fp = fopen(obs_file, "r");

date_time t;
fscanf(obs_fp, "%d %d %d %d %d %d\n", &t.day, &t.mth, &t.yr, &t.hrs, &t.mns, &t.scs); //This line runs fine
obs_head.obs->time = t;
printf("%d %d %d %d %d %d\n", t.day, t.mth, t.yr, t.hrs, t.mns, t.scs);

while(feof(obs_fp) == 0) {

    char id[5];
    char a[7];
    char b[7];
    location loc;
    double lng = 0.0, lat = 0.0;
    fscanf(obs_fp, "%s %lf %lf", id, &lat, &lng);  //Seg fault here on first run of loop
    loc.lat = lat;
    loc.lng = lng;
    add_obs_node(make_obs_node(id, loc, t));
}

要讀取的文件:

05 11 2014 14 53 00
AB01 52.408 -4.217

似乎文件指針在while語句周圍的某個地方發生了變化,如果我正在讀取文件末尾,我會理解的,但是在肯定還有行的情況下它失敗了。 另外,我知道Im可以正確打開文件,因為第一個fscanf運行良好。

有任何想法嗎?

錯誤使用了feof()和無限的fscanf("%s"...

feof()報告EOF是否是由於先前的IO而發生的,而不是是否即將發生。

改用

char id[5];
double lng = 0.0, lat = 0.0;
while(fscanf(obs_fp, "%4s%lf%lf", id, &lat, &lng) == 3) {
  loc.lat = lat;
  loc.lng = lng;
  add_obs_node(make_obs_node(id, loc, t));
}

我懷疑原始代碼在第二次迭代中失敗。 假設文件中的最后一個數據為"AB01 52.408 -4.217\\n" fscanf(obs_fp, "%s %lf %lf"將掃描到"\\n"並將"\\n"放回stdin因為它不是double一部分。未設置EOF標志feof()表示沒有EOF。因此fscanf(obs_fp, "%s %lf %lf"再次發生,但是id沒有保存任何數據,因為"%s"消耗了前導空格,但沒有非空格要保存。代碼不會檢查fscanf()返回值(錯誤),而是假設id數據add_obs_node()可能是垃圾),然后使用無效的字符串id調用add_obs_node()

其他故障機制也可能發生過-需要查看更多代碼。

底線:檢查fscanf()結果。 限制字符串輸入。


次要:請注意, "%d %d"之間的空格不是必需的,但可以有空格。 最后的"\\n"也可以,但是不需要。 它不只是消耗以下'\\n' ,而且還消耗所有以下所有空格。

if (6 != fscanf(obs_fp, "%d%d%d%d%d%d", 
    &t.day, &t.mth, &t.yr, &t.hrs, &t.mns, &t.scs)) {
  Handle_BadData();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM