写入以文本模式打开但在二进制模式下不会发生的文件时会发生什么转换?特别是在MS Visual C.
unsigned char buffer[256];
for (int i = 0; i < 256; i++) buffer[i]=i;
int size = 1;
int count = 256;
Run Code Online (Sandbox Code Playgroud)
二进制模式:
FILE *fp_binary = fopen(filename, "wb");
fwrite(buffer, size, count, fp_binary);
Run Code Online (Sandbox Code Playgroud)
与文字模式:
FILE *fp_text = fopen(filename, "wt");
fwrite(buffer, size, count, fp_text);
Run Code Online (Sandbox Code Playgroud) 我正在编写一个应用程序,它应该将一个浮点数组写入WAVE文件.我正在使用QDataStream,但这导致输出非常不可能,我无法解释.看起来QDataStream有时会选择32位浮点数,有时候会选择40位浮点数.这会弄乱整个输出文件,因为它必须遵守严格的格式.
我的代码大致如下所示:
float* array;
unsigned int nSamples;
void saveWAV(const QString& fileName) const
{
QFile outFile(fileName);
if (outFile.open(QIODevice::WriteOnly | QIODevice::Text))
{
QDataStream dataStream(&outFile);
dataStream.setByteOrder(QDataStream::LittleEndian);
dataStream.setFloatingPointPrecision(QDataStream::SinglePrecision);
// ... do all the WAV file header stuff ...
for(int ii = 0; ii < nSamples; ++ii)
dataStream << array[ii];
}
}
Run Code Online (Sandbox Code Playgroud)
我认为没有理由说这个代码会产生这样的副作用.所以我做了一个最小的例子来找出发生了什么.我用这个替换了for循环:
float temp1 = 1.63006e-33f;
float temp2 = 1.55949e-32f;
dataStream << temp1;
dataStream << temp1;
dataStream << temp2;
dataStream << temp1;
dataStream << temp2;
Run Code Online (Sandbox Code Playgroud)
然后我用Matlab打开输出文件,看看写入文件的字节.那些是:
8b 6b 07 09 // this is indeed …Run Code Online (Sandbox Code Playgroud)