C ++: сбой при получении данных через канал при использовании широких строк в обеих программах - PullRequest
1 голос
/ 08 апреля 2010

Я пытаюсь использовать следующий код на C ++ в Mac OS X Snow Leopard для получения вывода внешней программы через канал.

FILE * al = popen("program program.cfg", "r");

string data;
char buffer[100];
while (fgets(buffer, 100, al) != NULL)
data.append(buffer);
cout << "«" << data << "»" << endl;

pclose(al);

Однако данные не выводятся на печать.Я подозреваю, что проблема заключается в том, что внешняя программа выводит на wcout и wclog, но я не знаю, как с этим справиться.Я также пытался использовать wstring и fgetws, но это тоже не помогло.

Я читал об использовании boost :: iostreams и снова не повезло:

FILE * al = popen("program program.cfg", "r");
boost::iostreams::file_descriptor_source alDesc(fileno(al));
boost::iostreams::stream_buffer<boost::iostreams::file_descriptor_source> alStream(alDesc);
istream align(&alStream);

string alignOutput;
while (align) {
    getline(align, alignOutput);
    cout << "«" << alignOutput << "»" << endl;
}
align >> alignOutput;
alStream.close();
alDesc.close();

pclose(al);

Кто-нибудь знает, какова может быть реальная проблема и как ее решить?В случае, если кто-то спросит, и внешняя программа, и та, которая читает из канала, должны использовать wstring, поскольку я имею дело с данными, которые могут быть на любом языке, включая китайский и т. Д.за любые подсказки!

1 Ответ

0 голосов
/ 08 апреля 2010

Оказалось, что я перезаписывал файл, который использовала внешняя программа для ввода, поэтому он не дал никакого вывода ...

Тем не менее, приятно иметь вышеупомянутые фрагменты в одном месте, посколькуНепросто расшифровать документацию Boost.

...