C: вывод файла останавливается на 524,0 кб - PullRequest
2 голосов
/ 27 сентября 2010

Я пишу программу перебора для перечисления определенного типа целочисленной последовательности (не важно, что это за последовательность на самом деле).

Чтобы получить результаты, я создаю файл и хочу записать все выходные данные программы в этот файл. Однако, кажется, что файл «застаивается» на 524 кбайт, даже если программа должна что-то записать в него. То есть файл непрерывно записывается до тех пор, пока не будет достигнут размер файла 524,0 КБ, и больше ничего не записывается в файл.

Я знаю, что что-то должно быть записано в файл, потому что каждый раз, когда я записываю что-то в этот файл, я printf посылаю сообщение на экран, чтобы я знал, что что-то происходит.

Я использую C (довольно низкий уровень, т.е. только включая stdio.h, stdlib.h, time.h, string.h) в Ubuntu 10.04.

Я создаю файл следующим образом:

  time_t rawtime;
  char timeStamp[20];
  struct tm* clocktime;
  time(&rawtime);
  clocktime = localtime (&rawtime);
  strftime (timeStamp, 20, "%Y%m%d_%H%M%S", clocktime);
  char dimStamp[80];
  sprintf(dimStamp, "d%dl%d_", DIMENSION, MAXDEPTH);
  strcat(dimStamp, timeStamp);
  strcat(dimStamp, ".txt");
  FILE *output = fopen(dimStamp, "w");

Кто-нибудь сталкивался с подобной проблемой и / или кто-нибудь знает, из чего это может исходить?

Edit:

Может ли быть так, что вывод в файл на C является несколько асинхронным, т. Е. Что мне нужно очистить буфер или что-то еще, чтобы файл был записан мгновенно?

Ответы [ 4 ]

3 голосов
/ 27 сентября 2010

Вызов fflush иногда может решить эту проблему, вы также должны проверить, могут ли ваши данные быть двоичными данными, и вы должны использовать двоичный режим ("wb" вместо w), который запрещает символам EOFостановка ввода / вывода.

1 голос
/ 28 сентября 2010

Если ни одно из других предложений не сработало, вы можете попробовать запустить strace в своей программе и изучить места непосредственно перед и после места, где прекращается запись файла, чтобы увидеть, прекратила ли библиотека stdio выдачу вызовов write для файлаили если ядро ​​выдает ошибку.

strace -o my_program.strace  ./myprogram

Вам также следует проверить возвращаемые значения из ваших функций ввода-вывода на наличие ошибок и проверить errno на наличие ошибки.

0 голосов
/ 28 сентября 2010

Используйте gdb, чтобы присоединиться к вашей программе и посмотреть, что она делает: gdb -p [PID]

0 голосов
/ 27 сентября 2010

Вы не показывали свой реальный код записи, но в случае, если вы делаете fwrite (вывод необработанного байта), вам, возможно, придется открыть файл в двоичном режиме ("wb").

В противном случае вы можете столкнуться с ситуацией, когда некоторые из ваших данных, которые подходят для двоичного потока, могут рассматриваться как EOF для потока простого текста (например, один в вашем примере кода).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...