Есть одна программа, которая получает данные с gps приемника по протоколу NMEA. Далее она парсит эти данные и делает уже последующую обработку. Так сложились обстоятельства, что данного приемника больше нет, а программу дописать очень хочется. Я придумал решение. Создал другую программу, которая генерирует эти самые nmea-sentences. Программа-генератор создает строку std::string в стиле протокола каждые n секунд. Задержка осуществляется с помощью std::this_thread::sleep_for(n);
Вопрос состоит в следующем: Как я могу передавать эти данные в реальном времени в свою первую программу. (пробовал пайпы, но там проблема в том, что я передаю бесконечным циклом данные, а вторая программа может их считать, только когда я прекращаю запись первой программой).
Дополнение
Для примера привожу программу записи в файл:
// в данном случае использую текстовый файл,
// чтобы нормально отслеживать порядок событий
int main() {
std::string path = "pipe/PipeGSVsentence.txt";
std::ofstream file(path);
if (file.is_open()) {
for (size_t i = 0; i < 50; ++i) {
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
file << i << " HELLO WORLD %1 \n";
file.flush();
}
file.close();
} else {
std::cout << "Не удалось открыть файл." << std::endl;
}
return 0;
}
Вопрос такой: Как правильно читать файл, чтобы в консоль выводились новые строки в момент записи в файл другой программой? Пробовал что-то подобное:
int main() {
std::string path = "pipe/PipeGSVsentence.txt";
std::ifstream file;
file.open(path);
if (file.is_open()) {
std::string line;
while (true) {
while (std::getline(file, line)) {
std::cout << "Прочитано: " << line << std::endl;
}
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
file.close();
} else {
std::cout << "Не удалось открыть файл." << std::endl;
}
return 0;
}
В данной ситуации программа читает пару строк и зависает в бесконечном цикле.
Придумал вариант: в программе, записывающей строки, реализовать такой цикл:
- открыть файл
- записать строку
- закрыть файл
в программе читателе следующий цикл:
- открыть файл
- прочитать строки
- закрыть файл
Но мне кажется есть что-то поэффективнее, до чего я не могу додуматься и не могу найти. Да и плюсом, если использовать pipe, то одна из программ в какой-то момент завершится по причине SIGPIPE