2012-06-18 4 views
0

Это подзадача более серьезной проблемы, которую я опубликовал ранее. Ниже приведен фрагмент кода из пакета C++, с которым я пытаюсь работать. Цель состоит в том, чтобы записать значения в массиве float prob_estimates в выходной файл. Для некоторых, казалось бы, случайных линий записываются только некоторые из значений массива. Когда это может произойти? Как мне его отладить?В каких сценариях fprintf() не будет записываться в выходной файл

int j; 
    predict_label = predict_probability(model_,x,prob_estimates); 
    fprintf(output,"%g",predict_label); 
    for(j=0;j<model_->nr_class;j++) { 
     fprintf(output," %g",prob_estimates[j]); 
     fflush(output); 
    } 
    fprintf(output,"\n"); 

Я также хочу указать, что это, похоже, происходит только в том случае, если размер ввода довольно большой. Это часть более крупного цикла, который работает на строку входного файла (около 200 000 строк). Массив prob_estimates имеет 500 значений в строке. Выходной файл записывает менее 500 значений для некоторых 20-нечетных строк в выходном файле. Я запускал это несколько раз на подмножестве (с 20 000 строк), и все казалось прекрасным.

Обновление: Я попытался проверить возвращаемое значение fprintf после каждой попытки записи и, как оказалось, возвращает -1 для большого количества строк при попытке записать на выход.

fprintf encountered error at 19th value of line 2109359. Returned -1 
fprintf encountered error at 373th value of line 2109359. Returned -1 
fprintf encountered error at 229th value of line 2109360. Returned -1 
fprintf encountered error at 87th value of line 2109361. Returned -1 
fprintf encountered error at 439th value of line 2109361. Returned -1 

Это когда я изменил код выше следующим образом:

for(j=0;j<model_->nr_class;j++) { 
      int e = fprintf(output," %g",prob_estimates[j]); 
      if (e < 0) { 
      printf("fprintf encountered error at %dth value of line %d. Returned %d",j ,count ,e); } 
     } 

count Вот это переменная, которая подсчитывает количество линии. Он увеличивается в верхней части внешнего контура (здесь не показано). Что я могу сделать, чтобы понять, почему fprintf возвращает -1?

+1

Вы пытались создать минимальный тестовый пример? из вашего кода неясно, какой вход/выход был. –

+0

Возможно ли, что 'model _-> nr_class' как-то отличается для тех строк, которые не выглядят правильно? – twalberg

+0

Всегда ли это такие же 20 строк, которые не печатаются, или они меняются после каждой попытки? – jxh

ответ

1

Несколько вещей, которые вы могли бы сделать:

  1. печать все также утешают, чтобы увидеть, если проблема в выходном файле или в другом месте

  2. печати model_->nr_class, чтобы убедиться, что число значения, которые вы ожидаете

  3. Проверьте выходной файл только после его закрытия. Хотя вы создаете fflush, может быть, что другие места обновляют файл и не обтекают его. fclose будет. Я предлагаю, чтобы вместо того, чтобы промывать файл каждой строкой, откройте его в режиме добавления в начале функции и закройте его в конце.

Надеется, что это помогает

+0

Я пробовал проверять значения как j, так и модели _-> nr_class, и они оба 499 в конце каждого цикла, т. Е. If (j! = Model_-> nr_class) printf («Что-то не так») не распечатывалось все на консоли. – atlantis

+0

Это место, где записывается файл AFAIK. И есть fclose (вывод), который происходит в конце, когда обрабатывается весь входной файл. Я добавил fflush() после каждой строки, чтобы убедиться, что все в строке записано в файл. например выходной файл, кажется, записывает только 160 значений для n-й строки, в то время как строки, предшествующие и следующие за ним, имеют все 500 значений, написанных правильно. – atlantis

+1

'i.e. if (j! = model_-> nr_class) printf («Что-то не так») ничего не выводил на консоль. 'явно укажите для 'model _-> nr_class! = 499', то, что вы написали, всегда будет ложным, конечно. – unkulunkulu

0

Теперь вы обнаружили, что fprintf возвращает ошибку, необходимо проверить значение егто после провала попытки вызова, чтобы выяснить, что фактическая причина ошибки.

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