Ifstream не видит новый контент в OSX - PullRequest
2 голосов
/ 28 июня 2019

В настоящее время я пытаюсь прочитать поток 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());

1 Ответ

2 голосов
/ 28 июня 2019

После вас clear() stdout_stream, а также sync() это:

stdout_stream.sync();

Это конкретный запрос на очистку любого базового буфера потока.

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