通常我住在我守卫的C#世界。但有时候我必须突破并在外面做点什么。
目前我必须解码一个audiostream,并且必须直接在我的c ++控制台应用程序中输出它。
如果我将内容写入文件,我可以听到正确的结果。 但如果我使用而不是fstream cout,我只会发出嘈杂的声音。
我该如何做到正确? 这里是工作文件流代码:
fstream wavefile;
wavefile.open(output, ios::out | ios::binary | ios::trunc);
//do something
wavefile.write((char*) &waveheader, waveheadersize);
//do something else
do {
//do something
//decodedBuffer is of type BYTE* , decodedLength is of type DWORD
wavefile.write((char*) decodedBuffer, decodedLength);
wavefile.flush();
} while (encodedLength > 0);
我没有工作的cout代码:
std::cout.setf(ios::out | ios::binary | ios::trunc);
//do something
//this works, I got the same output
cout << structToString(&waveheader) << endl;
//do something else
do {
//do something
cout << (char *)decodedBuffer;
} while (encodedLength > 0);
提前致谢
答案 0 :(得分:5)
首先,绝对没有理由为std::fstream
和std::cout
使用不同的代码(除此之外,您的cout
- 代码使用格式化输出,并且错误):
在这两种情况下,您都在使用ostream
- 界面。
首先,首先,通过用第一个代码替换它来修复第二个代码(尽可能)。
现在,我们找到了一个区别(您尝试使用setf
覆盖):std::cout
处于文本模式,而不是二进制模式!
很遗憾,ios::out
,ios::binary
和ios::trunc
都不是格式化标记,因此您无法使用setf
设置它们。
实际上,事后不能改变模式(至少不可移植)。
幸运的是,您可以简单地忽略在许多系统上使用错误的模式,因为Linux和其他系统等同于textmode和binary-mode。在Windows上,这个黑客应该让你解决它:
cout.flush();
fflush(stdout);
_setmode(_fileno(stdout), _O_BINARY);
答案 1 :(得分:1)
简单的答案是,你做不到。你需要输出
二进制模式。当您完成时,一劳永逸地选择模式
打开文件,std::cout
始终以文本模式打开。
因为你只是在编写一个字节块,所以最简单
解决方案是使用系统级请求。在Windows下
例如,您可以使用GetStdHandle( STD_OUTPUT_HANDLE )
获取标准输出的句柄,并WriteFile
写一个块
的字节数。 (在Unix下,标准的文件描述符
out始终为1
,函数为write
。但是从那以后
在Unix下,文本模式和二进制模式没有区别,
我认为这不是你的情况。)
答案 2 :(得分:-2)
试试这个,
std::cout.write(reinterpret_cast<char*>(decodedBuffer), decodedLength);
但是我不确定structToString(&amp; waveheader)是否正常工作,但你似乎没问题。