从标准输出(C ++)获取信息?

时间:2011-10-11 11:53:14

标签: c++ file iostream

如何从标准输出中读取以下信息?

  

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 个答案:

答案 0 :(得分:1)

这只是在shell中正确处理输出的问题。

想象一下:

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;始终有效。但是,从C字符数组构造std::string会在空字节处停止,因此您必须使用不同的构造函数:

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

std::string s1(cstr);  // wrong, gives you "He"
std::string s2(cstr, sizeof(cstr));  // correct

答案 1 :(得分:1)

只需指定二进制模式:

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'