c++ cout instead of fstream

c++ cout instead of fstream

本文关键字:fstream of instead cout c++      更新时间:2023-10-16

通常我生活在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::fstreamstd::cout使用不同的代码(除此之外,您的cout-代码使用格式化的输出,并且是错误的):

在这两种情况下,您都在使用他们的ostream-接口。

因此,首先,修复第二个代码(尽可能),将其替换为第一个代码。


现在,我们来看一个区别(您试图用setf来掩盖它):std::cout处于文本模式,而不是二进制模式

不幸的是,ios::outios::binaryios::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)是否正常工作,但你似乎可以接受