Программа C ++ не может выдать вывод при перенаправлении stdout в файл в Linux

Я пытаюсь запустить простую программу на языке C ++ ниже на кластере компьютеров (под управлением Linux, CentOS 6).

#include <iostream>
#include <fstream>

int main(int argc, char *argv[]) {
std::ofstream file;
file.open("/dev/stdout");
file << "Hello, world\n";
file.close();
return 0;
}

Когда я компилирую (используя g++ test.cpp) и запустите программу на головном узле, она работает так, как я и ожидал, позволю ли я отправить выходные данные в терминал, чтобы перенаправить его в файл. То есть,

$ ./a.out > myfile.txt

производит файл myfile.txt которая содержит строку «Hello, world» (я использую bash). Если я запускаю его на любом из исполнительных узлов и отпускаю вывод в терминал, он работает просто отлично; однако, если я пытаюсь перенаправить вывод в файл, файл всегда будет пустым.

Я знаю, что это не «стандартный» способ, которым можно было бы написать программу hello world на C ++. Я на самом деле испытываю трудности со сторонней программой, которая пытается записать двоичные данные в стандартный вывод, используя библиотеку, для которой требуется имя файла. Пытаясь уменьшить код для публикации, я обнаружил, что приведенный выше код является простейшим кодом, который воспроизводит проблему, которую я вижу в более крупной программе.

Я не опытный программист на C ++, поэтому понятия не имею, должен ли приведенный выше пример работать или не работать, но тот факт, что он работает на некоторых компьютерах, как я ожидал, но не на других, поставил меня в тупик. Я также не уверен, имеет ли это отношение к коду C ++, bash или конфигурации системы. Люди, которых я спрашивал об этом, уже выглядят одинаково смущенными и не могут даже предложить, с чего начать.

Я создал простые программы hello world на других языках, и все они работают должным образом на узлах выполнения, поэтому я предполагаю, что это что-то специфическое для C ++.

Может кто-нибудь объяснить мне или помочь мне определить, почему я наблюдаю различное поведение на машинах, работающих под управлением одной и той же ОС (и которые должны быть настроены одинаково), и есть ли (предпочтительный) способ в C ++ для получения библиотечных функций, которые Требуется имя файла для записи в стандартный вывод?

0

Решение

Я посмотрел вокруг и обнаружил, что может или не может быть программа, которую вы используете: UUENCODE. Если это не так, не обращайте внимания на весь этот ответ. Эта программа выглядит хитрой в использовании, поэтому я обрисую в общих чертах то, что я считаю разумным способом ее использования:

Дайте что-нибудь как «имя выходного файла» uuencode

uuencode mybinaryfile anything > mytextfile

Затем перенесите полученный «mytextfile» в новую систему, где вы запускаете

uudecode mytextfile -o mynewbinaryfile

Который производит «mynewbinaryfile». Опять же, дизайн этой программы (особенно аргумент, который я передал как «что-нибудь») невелик, и существуют проблемы с порядком байтов и размерами при переносе двоичных файлов с одного компьютера на другой, которые эта программа игнорирует. Я рекомендую отойти от этого.

Что касается объяснения, uudecode пытался записать в / dev / stdout, а на кластерах и машинах HPC все обычные условия, такие как / dev / stdout, больше не являются тем, чем они кажутся.

1

Другие решения

Ну, вероятно, проблема с mode параметр для fstream.open(),

И, кстати, это довольно странный способ выполнить вывод конфигурации …

0

По вопросам рекламы [email protected]