freopen_s («conout $») и fclose

0

Visual C++ сообщает, что недопустимый параметр был передан fclose, причем этот параметр является FILE* возвращаемым freopen_s:

#include <WinSock2.h>
#include <iostream>

int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) {
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(nCmdShow);

#ifdef _DEBUG
    AllocConsole();
#else
    AttachConsole(ATTACH_PARENT_PROCESS);
#endif

    FILE* pCout;
    freopen_s(&pCout, "conout$", "w", stdout); //returns 0

    fclose(pCout);

#ifdef _DEBUG
    system("pause");
#endif

    FreeConsole();

    return 0;
}

Должен ли я не пытаться закрыть conout $ в конце программы? Исключено ли исключение, поскольку указатель файла разделяется между процессами для всех консольных выходов?

  • 0
    Нет репродукции с Visual C ++ 2013. Пожалуйста, предоставьте полную репродукцию, которая демонстрирует проблему. Что возвращает вызов freopen_s ? (Если вы собираетесь вызвать _s вариант, вам нужно проверить возвращенный статус.)
  • 0
    Возвращаемое значение errno_t равно 0, что означает отсутствие ошибки, верно?
Показать ещё 12 комментариев
Теги:
freopen

1 ответ

3
Лучший ответ

Вызов fclose не работает, потому что вы передаете пустой FILE*. FILE* имеет значение null, поскольку вызов freopen_s завершается с ошибкой. Этот вызов завершается с ошибкой, потому что в процессе нет консоли, которую нужно открыть.

Ваша программа работает в отладочных сборках, потому что вы вызываете AllocConsole для выделения консоли для вашего процесса. Ваша программа не работает в сборках релизов, потому что вы не вызываете AllocConsole; вы вызываете AttachConsole, который не будет работать (и не имеет эффекта), если родительский процесс не имеет консоли.

  • 0
    +1 за хорошее суммирование всех комментариев и моего ответа в один сплоченный ответ. Я сделал ошибку, продолжив комментарии в ответ.
  • 0
    Ладно, упс. Это должно было быть очевидно с самого начала, но я проверял вывод из командной строки, где AllocConsole и freopen_s не работали, и отлаживал от VS без консоли, где AllocConsole и freopen_s терпели неудачу. Отладчик по-прежнему сообщал, что возвращаемое значение freopen_s равно 0, поэтому, возможно, оно было просто неточным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню