fopen не открывает поток файлов ... как мне решить эту проблему? - PullRequest
1 голос
/ 16 февраля 2011

Я пытаюсь написать файл и добавить к нему данные.

Вот фрагмент моего кода.thresh - это короткий без знака.

    FILE *fp_th;
    fp_th = fopen("threshold.txt", "a");
    printf("opening file failed: %s\n", strerror(errno));
fprintf(fp_th,"%d ", thresh);
    fclose(fp_th);

До того, как он заработал нормально, но я изменил часть своего кода, и внезапно он больше не распечатывается.

IВы подтвердили, что fopen не открывает поток файлов с

printf(" check fp_th = %p \n", fp_th);

. Распечатывает check fp_th = 00000000.

РЕДАКТИРОВАТЬ: Добавлено printf("opening file failed: %s\n", strerror(errno)); после fopen.Вывод говорит об ошибке нет.Это врет?Странно ..

Странно, что я пишу и добавляю похожий файл, и все же этот файл работает нормально.Как вы решаете fopen, который возвращает NULL?Почему это происходит?Спасибо!

Ответы [ 4 ]

5 голосов
/ 16 февраля 2011

Во-первых

fprintf(fp_th,"%d ", thresh);

Обычно буферизует вывод, пока вы не закроете файл или внутренний буфер FILE * не заполнится. Вы не можете сразу увидеть вывод в файле

Вы можете выполнить fflush () ФАЙЛ *, чтобы записать его в файл, когда решите.

fprintf(fp_th,"%d ", thresh);
fflush(fp_th);

Во-вторых

printf(" check fp_th = %d \n", fp_th);

Это не проверяет, является ли fp_th недействительным. Он просто печатает значение указателя fp_th как целое число со знаком, и значение -7323824 может быть таким же хорошим, как и любое другое значение, это будет даже менее значимым и, вероятно, неопределенным, если размер ваших указателей не совпадает с размером int.

Чтобы напечатать указатель, вы должны использовать% p

printf(" check fp_th = %p \n", fp_th);

fopen возвращает NULL в случае сбоя, вы должны проверить это, чтобы узнать, не удалось открыть файл или нет.

FILE *fp_th;
fp_th = fopen("threshold.txt", "a");
if(fp_th == NULL) {
   printf("opening file failed: %s\n", strerror(errno));
   return;
}
3 голосов
/ 17 февраля 2011

Во-первых, всегда проверяйте возвращаемое значение fopen для NULL, что означает сбой.

Чтобы узнать, что пошло не так при открытии файла, вы можете использовать perror.

  if (fp_th == NULL) {
    perror ("Error opening threshold file");
    exit(EXIT_FAILURE);
  }

Если вы все еще не можете выяснить, пока получаете permission denied или No such file or directory, вы можете использовать strace (при условии Linux) и искать соответствующий системный вызов.

0 голосов
/ 02 марта 2015

У меня была похожая проблема сегодня. Мой код открывал файлы N-1, но таинственно разбился в N-м файле, хотя этот файл определенно существовал ...

Перрор показал, что я на самом деле никогда не закрывал все эти файлы - к своему смущению я забыл fclose (fd) ...

До сих пор я не использовал perror, но теперь я понимаю, насколько он ценен. :)

0 голосов
/ 16 февраля 2011

До того, как все заработало, но я изменил часть своего кода, и он неожиданно больше не печатается.

Если ваш код изменил текущую работукаталог, это может привести к тому, что файл не будет найден, так как вы не указываете полный путь.В этом случае fp_th должен быть нулевым указателем, который вы можете проверить.Ваша печать предполагает, что он не возвращает нулевой указатель, а скорее открыл файл.Подробнее см. fopen .

...