fflush завершается ошибкой в ​​Visual C ++ 2010 - PullRequest
1 голос
/ 12 апреля 2011

Я пытаюсь запустить какой-то код, но fflush() с ошибкой:

 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);
    }

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

Как ни странно, такое поведение вызвано тем, что вы передаете режим 'c' в свой вызов fopen. Помощь говорит о флаге:

Включите флаг подтверждения для соответствующего имени файла, чтобы содержимое буфера файлов записывалось непосредственно на диск, если fflush или _flushall вызваны

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

0 голосов
/ 12 апреля 2011

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

UPD: По пояснениям из комментариев мое предложение не совсем корректно. Microsoft CRT имеет особое значение для fflush в потоках чтения. Очищает эффект ungetc

...