c ++ cout而不是fstream

时间:2014-10-28 19:03:55

标签: c++ fstream cout

通常我住在我守卫的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);

提前致谢

3 个答案:

答案 0 :(得分:5)

首先,绝对没有理由为std::fstreamstd::cout使用不同的代码(除此之外,您的cout - 代码使用格式化输出,并且错误):

在这两种情况下,您都在使用ostream - 界面。

首先,首先,通过用第一个代码替换它来修复第二个代码(尽可能)。


现在,我们找到了一个区别(您尝试使用setf覆盖):std::cout处于文本模式,而不是二进制模式

很遗憾,ios::outios::binaryios::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)是否正常工作,但你似乎没问题。