У меня есть класс C++ Archive
с функцией-членом extractData()
. Эта функция вызывает realExtractData()
, которая реализована в отдельной библиотеке C.Стандартный вывод зависает после добавления оператора fprintf() с пользовательской стандартной ошибкой
Я хочу передать функцию extractData()
пару FILE *
экземпляров, которые, как правило, stdout
и stderr
, но я хочу, чтобы обеспечить возможность указателей пользовательских файлов, а также:
class Archive {
public:
...
int extractData(string id, FILE *customOut, FILE *customErr);
...
};
int
Archive::extractData(string id, FILE *customOut, FILE *customErr)
{
if (realExtractData(id.c_str(), customOut) != EXIT_SUCCESS) {
fprintf(stderr, "something went wrong...\n");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
Если я вызываю выше как указано, задержка вывода данных на стандартный вывод отсутствует. Все извлеченные данные будут посланы в стандартный вывод (stdout
) почти сразу:
FILE *outFp = stdout;
FILE *errFp = stderr;
Archive *archive = new Archive(inFilename);
if (archive->extractData(id, outFp, errFp) != EXIT_SUCCESS) {
fprintf(errFp, "[error] - could not extract %s\n", archive->getInFnCStr());
return EXIT_FAILURE;
}
Если изменить extractData()
так, что его fprintf()
вызов использует customErr
:
int
Archive::extractData(string id, FILE *customOut, FILE *customErr)
{
if (realExtractData(id.c_str(), customOut) != EXIT_SUCCESS) {
fprintf(customErr, "something went wrong...\n"); /* <-- changed this line */
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
... тогда, когда я бегу двоичный, двоичный файл, похоже, зависает при обработке ввода и печати на стандартный вывод.
Если я изменяю fprintf()
назад к использованию stderr
и не customErr
, все еще раз работать должным образом, т.е. данные сбрасываются на стандартный вывод (мой customOut
) немедленно.
Это проблема буферизации? Есть ли способ исправить это?
Где бы я поместил вызов 'fflush()'? Если я поместил его после оператора 'fprintf()', он, похоже, не исправил зависание. –
Честно говоря, я бы попытался избавиться от fprintf в пользу выполнения прямого вызова без буферизации write(), как упоминалось в этой ссылке. Это единственный способ, я думаю, это будет так же быстро, как распечатка std :: cerr/stderr. –