c++ cout instead of fstream
c++ cout instead of fstream
通常我生活在C#的守护世界中。但有时我不得不爆发出来,在外面做点什么。
目前,我必须解码一个音频流,并必须在我的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);
提前感谢
首先,绝对没有理由为std::fstream
和std::cout
使用不同的代码(除此之外,您的cout
-代码使用格式化的输出,并且是错误的):
在这两种情况下,您都在使用他们的ostream
-接口。
因此,首先,修复第二个代码(尽可能),将其替换为第一个代码。
现在,我们来看一个区别(您试图用setf
来掩盖它):std::cout
处于文本模式,而不是二进制模式!
不幸的是,ios::out
、ios::binary
和ios::trunc
都不是格式化标志,因此无法使用setf
设置它们。
事实上,该模式在事后根本无法更改(至少不可移植)。
幸运的是,您可以忽略许多系统上的错误模式,因为Linux和其他系统将文本模式和二进制模式等同起来。在windows上,这个黑客应该会让你绕过它:
cout.flush();
fflush(stdout);
_setmode(_fileno(stdout), _O_BINARY);
简单的答案是你不能。您需要在中输出二进制模式。当您打开文件,并且std::cout
总是以文本模式打开。
由于您只是在写一个字节块解决方案是使用系统级请求。在Windows下,例如,可以使用GetStdHandle( STD_OUTPUT_HANDLE )
获取标准输出的句柄,并使用WriteFile
编写块(在Unix下,标准的文件描述符out总是1
并且函数是write
。但从那以后Unix下的文本模式和二进制模式没有区别,我想这不是你的情况。)
试试这个,
std::cout.write(reinterpret_cast<char*>(decodedBuffer), decodedLength);
但我不确定structToString(&waveheader)是否正常工作,但你似乎可以接受
- 在fstream期间忽略空行
- Usages of std::move
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 具有变量Number of Arguments的std::函数的矢量
- Capacity of a deque
- 使用fstream对txt文件中的数字进行循环
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 无法打开 fstream C++文件,即使它与 .cpp 位于同一位置
- Deprecation of _writeBarrier()
- constexpr begin of a std::array
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- C++ "error: invalid use of void expression"
- 我看到"use of undeclared identifier"错误,有人可以告诉我如何解决它吗?
- 赛通"Cannot take address of memoryview slice"
- 使 std::fstream 写入文件末尾,但从头开始读取
- C++ Version Of Double.longBitsToDouble
- 收到错误"invalid use of non-static data member 'stu::n' "
- C++ Usage of AsyncCallback
- c++ cout instead of fstream