2014-12-10 2 views
1

Действительно странная проблема с fscanf. Кажется, он не может найти файл. Heres код:c - ошибка сегментации 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 

Похоже, что указатель файла изменилось где-то заявление, в то время, я бы понял, если бы я читал на конец файла, но он терпит неудачу, пока есть определенные линии. Кроме того, я знаю, что я открываю файл правильно, так как первый fscanf работает нормально.

Любые идеи?

+1

Где произносится 'id'? Он выделен? – MahlerFive

+1

1) Проверить результат 'fscanf (obs_fp,"% d% d% d% d% d% d \ n "...' 2) не использовать 'while (feof (obs_fp) ... fscanf (obs_fp, "% s% lf% lf" ', используйте' while (fscanf (obs_fp, "% 4s% lf% lf", id, & lat, & lng) == 3) {'. – chux

+0

id объявлен' char id [5] 'на строке ниже' while'. –

ответ

1

Неправильное использование 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)); 
} 

Я подозреваю, оригинальный код не удалось на 2-й итерации. Предположим, что последние данные в файле: "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" потребляют ведущее белое пространство, но не имеет небелого пространства для сохранения. Код не проверяет возвращаемое значение (плохое), но принимает хорошие данные в id, что может быть нежелательным. Затем вызывается add_obs_node() с недопустимой строкой id.

Возможно, возникли и другие неисправные механизмы - необходимо увидеть больше кода.

Итог: проверка fscanf() результаты. Ограничить ввод строки.


Minor: Обратите внимание, что пробелы между "%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(); 
} 
+0

Код завершился неудачно на первой итерации, я шагнул и первый раз дошел до строки 'fscanf (obs_fp,"% s% lf% lf ", id, & lat, &lng);' it seg faults. Я также пробовал ваш предложенный код , и это дает ту же ошибку, что и ошибка на 'while (fscanf ...' строка –

+0

@ user168057 Давайте попробуем некоторые основы: Is 'obs_fp! = NULL' ?, делает первый' fscanf() 'return 6? Is' #include 'us ред? Если структура 't' все' int'? – chux

+0

@ user168057 Разве это не говорит о проблеме, предлагайте более надежный подход: отделяйте IO от разбора.'char buf [100]; while (fgets (buf, sizeof buf, obs_fp)) {if (3! = sscanf (buf, "% 4s% lf% lf", ...) break; ...} '. – chux

Смежные вопросы