Переносимый способ перенаправить funopen на стандартный ввод / вывод - PullRequest
0 голосов
/ 23 декабря 2019

Я использую funopen (в частности, fropen, fwopen) для эмуляции взаимодействия ввода-вывода с пользователем в целях тестирования. Пока это выглядит так:

FILE* F=fropen(...);
std::swap(F,stdin);
//  some code to test
std::swap(F,stdin);
fclose(F);

Hovewer, я обнаружил, что он не работает на определенных платформах (а именно, android-ndk), потому что стандарт не гарантирует, что stdin / stdout будетlvalue.

Я обошел эту проблему:

#ifdef __ANDROID__
#define IOSWAP(x,y) std::swap(*x,*y)
#else
#define IOSWAP(x,y) std::swap(x,y)
#endif
...
IOSWAP(F,stdin);

Однако это меня раздражает, потому что совершенно неправильно менять содержимое структуры FILE, специфичной для реализации.

Я также пытался dup2, но он работает с номерами дескрипторов и fileno() возвращает -1 для результатов funopen.

Есть ли какой-либо переносимый способ сделать это? Что-то вроде freopen, но принимает FILE* указатель вместо const char* имени файла. Переносимость между * системами NIX достаточна, потому что funopen в любом случае недоступна на других платформах.

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