Я использую 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
в любом случае недоступна на других платформах.