2011-04-12 3 views
1

Я пытаюсь запустить код, но fflush() с ошибкой:fflush терпит неудачу на Visual C++ 2010

Invalid file descriptor. File possibly closed by a different thread 

Вот соответствующая часть кода:

fhandle = fopen("dbfile.bin", "rbc"); 
    /* There is a valid dbfile.bin file - get file size */ 
    _fstat(_fileno(fhandle), &file_stat); 
    printf("dbfile.bin size = %d\n", file_stat.st_size); 

    g_tpd_list = (tpd_list*)calloc(1, file_stat.st_size); 

    if (!g_tpd_list) 
    { 
     rc = MEMORY_ERROR; 
    } 
    else 
    { 
     fread(g_tpd_list, file_stat.st_size, 1, fhandle); 
     fflush(fhandle); 
     fclose(fhandle); 
    } 
+0

Обычно вы очищаете файл, когда вы его пишете (чтобы очистить буфер записи) ... вам не нужно его скрывать за то, что вы делаете, какой эффект вы ожидаете? – forsvarir

+0

Я ничего не жду. эта часть кода предоставляется инструктором как есть. – chustar

ответ

1

Странно, похоже, что такое поведение вызвано тем, что вы передаете 'c' в свой fopen звонок. Справка говорит об этом флаге:

Enable the commit flag for the associated filename so that the contents of the file buffer are written directly to disk if either fflush or _flushall is called

Поэтому я не уверен, почему он заставляет его вести себя так, как есть. Однако, если вы его удалите, работает вызов fflush. Возможно, этот флаг равен , отменяя способность fflush очистить буфер чтения и всегда пытаться очистить буфер записи.

0

fflush предполагается сбросьте буфер записи. По стандарту C. Неопределенное поведение вызывает fflush в потоках только для чтения. Кажется, что Microsoft CRT рассматривает такой вызов как ошибку. В любом случае вам не нужен fflush.

UPD: В соответствии с разъяснениями из комментариев мое предложение не совсем корректно. Microsoft CRT имеет специальное значение для fflush для потоков чтения. Это устраняет эффект от игрока ungetc

+0

На самом деле, что помогает VS, «Если поток открыт для ввода, fflush очищает содержимое буфера. fflush отрицает эффект любого предыдущего вызова, чтобы отключить его от потока. – forsvarir

+0

@forsvarir, конечно, это функция, о которой я не знал. Однако в этом примере кода нет вызовов ungetc –