Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QDataStream有时使用32位浮点,有时使用40位浮点_C++_Wav_Qt4.8 - Fatal编程技术网

C++ QDataStream有时使用32位浮点,有时使用40位浮点

C++ QDataStream有时使用32位浮点,有时使用40位浮点,c++,wav,qt4.8,C++,Wav,Qt4.8,我正在编写一个应用程序,它应该将一个浮点数组写入一个WAVE文件。我正在为此使用QDataStream,但这导致了一个我无法解释的非常不可能的输出。QDataStream有时选择32位浮点,有时选择40位浮点。这会弄乱整个输出文件,因为它必须遵循严格的格式 我的代码大致如下所示: float* array; unsigned int nSamples; void saveWAV(const QString& fileName) const { QFile outFile(fi

我正在编写一个应用程序,它应该将一个浮点数组写入一个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];
    }
}
我非常随意地选择了这些值,它们恰好具有这种效果。一些值导出为4字节,其他值导出为5字节数字。有人知道这可能是什么原因吗

编辑: 当检查两个浮点数的大小时,它们看起来确实有4
char
s长,不过:

    qDebug() << sizeof(temp1); // prints '4'
    qDebug() << sizeof(temp2); // prints '4'

qDebug()注意:我不是100%确定我是对的,我很想听到我错了,但我认为是这样的:


它有自己的序列化格式,虽然我没有检查,但这可能与此有关。关键是,它并不意味着你要用它做什么:只写任何二进制格式。您可以使用该类,但我相信您只需要使用方法,并自己处理字节顺序等。

答案在于打开输出文件:应该省略
QIODevice::Text
标志,因为它是一个二进制文件。如果包含文本标志,则在每个
0a
之前插入一个
0d
字符。因此,每个包含
0a
字符的浮点看起来都比
char

此答案的所有学分均计入以下给出的答案:

即使我没有使用IODevice::Text标志,我也遇到了类似的问题。我发现添加一行

dataStream.device()->setTextModeEnabled(false);

解决了这个问题,以确保您处于二进制模式。

谢谢,这至少提供了一种不用for循环的方法;太好了。但它仍然会产生相同的不一致性,一些浮动比其他浮动长!这似乎意味着数组中的浮点是可变长度的(4或5字节),这似乎真的不太可能。
    qDebug() << sizeof(temp1); // prints '4'
    qDebug() << sizeof(temp2); // prints '4'
dataStream.device()->setTextModeEnabled(false);