получать информацию из стандартного вывода (C ++)? - PullRequest
0 голосов
/ 11 октября 2011

Как я могу прочитать приведенную ниже информацию из стандартного вывода?

Fmail@yasar.com \ 0Tketo@keeto.com \ 0Tmail@lima.com \ 0 \ 0

Я хочу получить всю информацию, включая символы \0.

С таким кодом:

string s;
fstream fs("/dev/stdout", fstream::in);
fs >> s;

Если я записываю s в файл, я получаю следующий вывод:

Ftest555 @ itap.gov.trTislam.yasar @ inforcept.comTaa @ test.comTbb @ test.com

Все \0 и \0\0 потеряны.

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 11 октября 2011

просто укажите двоичный режим:

std::string result;
std::fstream fs( "/dev/stdout", std::fstream::in|std::fstream::binary );
while ( !fs.eof() ) {
  std::string b;
  fs >> b;
  result += b;
}
fs.close();

Я тестирую его с помощью файла, созданного:

std::fstream out( "C:\\tmp\\test1.txt", std::fstream::out );
out.write( "aaa\n\0\0bbb\0ccc", 13 );
out.close();

Но тогда вам придется обращаться к данным с помощью итераторов (result.begin (), result.end ()), потому что вызов c_str () будет обрезаться при '\ 0'

1 голос
/ 11 октября 2011

Это всего лишь вопрос обработки правильного вывода в вашей оболочке.

Представьте себе это:

cat file_with_nulls

Это будет опрометчиво выводить содержимое file_with_nulls на консоль, и, конечно, консоль может быть не оборудована для отображения непечатных символов. Тем не менее, следующие работы:

cat file_with_nulls > otherfile

Это создаст идеальную копию file_with_nulls.

То же самое работает с вашей программой. Вы можете написать что угодно в стандартный вывод. Но не ждите, что ваш терминал или консоль сделают с ним что-нибудь полезное! Скорее, перенаправьте вывод в файл, и все хорошо:

./myprog > output.bin

Обратите внимание, что строковые операции C обычно не работают с нулевыми байтами, поэтому в C вы должны использовать fwrite(). В C ++ строки могут содержать любой символ, поэтому std::cout << str; всегда работает. Однако построение std::string из массива символов C останавливается на нулевом байте, поэтому вы должны использовать другой конструктор:

char cstr[] = { 'H', 'e', 0, 'l', 'l', 'o', 0 };

std::string s1(cstr);  // wrong, gives you "He"
std::string s2(cstr, sizeof(cstr));  // correct
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...