В настоящее время я пытаюсь прочитать поток if, который пишет другой процесс, и затем отправить его в мой стандартный поток вывода.Файл может быть довольно большим, поэтому я надеюсь сделать все возможное, чтобы не перечитывать весь поток.Для этого я открывал ifstream и вызывал «clear» для удаления бита EoF.
На наших хостах linux это работает нормально (Arch, Debian, Ubuntu), однако в наших тестированных версияхOSX это не работает.
Я создал наименьший из возможных тестовых файлов, чтобы проверить это:
#include <chrono>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <thread>
int main() {
auto temp_to_close = std::ofstream { std::string("stdout") };
temp_to_close.close();
auto stdout_stream = std::ifstream(std::string("stdout"));
while (true) {
stdout_stream.clear();
std::cout << "--------------------------------------------" << "\n";
std::cout << "EOF Stdout: " << (stdout_stream.eof() ? "T" : "F") << "\n";
std::cout << "Fail Stdout: " << (stdout_stream.fail() ? "T" : "F") << "\n";
std::cout << "--------------------------------------------" << "\n";
std::string line;
while (std::getline(stdout_stream, line)) {
std::cout << line << "\n";
}
std::cout << "[" << (stdout_stream.eof() ? "T" : "F") << (stdout_stream.fail() ? "T" : "F") << "] line: " << line << "\n";
std::cout.flush();
std::this_thread::sleep_for(std::chrono::seconds(1));
}
return 0;
}
На Mac и Linux это процесс, которому мы следуем:
$ clang++ main.cpp -std=c++17 -Wall -o a.out
$ ./a.out
$ #open a new terminal window, cd to the same directory.
$ #next type: "echo "hello" >> stdout"
$ #switch back to the main window
В Linux это в итоге выводит: "привет" среди других выводов:
--------------------------------------------
EOF Stdout: F
Fail Stdout: F
--------------------------------------------
hello
[TT] line:
Что мы и ожидаем.На Mac, однако, мы просто получаем:
--------------------------------------------
EOF Stdout: F
Fail Stdout: F
--------------------------------------------
[TT] line:
Информация о версии OSX:
Mac OSX: v10.14.5
XCode Version: v10.2.1 (10E1001)
Clang++ --version:
Apple LLVM Version 10.0.1 (clang-1001.0.46.4)
Target: x85_64-apple-darwin-18.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
EDIT , как упомянуто Eljay в комментариях.При добавлении seekg все платформы видят контент:
stdout_stream.clear();
stdout_stream.seekg(stdout_stream.tellg());