2016-11-22 12 views
0

バイナリデータをファイルに書きたいQtのツールをプログラミングしています。ファイルに小数点の値 '10'(0000 1010バイナリ)を書き込もうとしているとき以外は、すべて正常に動作します。この場合、別のバイトの前に値 '0000 1101'を持つ追加のバイトが得られます。ファイルに書き込むデータの量は関係ありません。書き込むとすぐに別のバイトが得られます。00001010をQfileに書き込むと別のバイトが前に追加されます

私は、次のコードにそれを壊した:

#include <QCoreApplication> 
#include <QFile> 
#include <iostream> 
#include <QString> 
#include <QDataStream> 

int main(int argc, char *argv[]) 
{ 
QCoreApplication a(argc, argv); 

QString SavePath; 
SavePath = qApp->applicationDirPath(); 
SavePath.append("/test.bin"); 

QFile file(SavePath.toLocal8Bit().constData()); 
if (file.exists()) 
    file.remove(); 
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) 
{ 
    std::cout << "Kann Datei zum Speichern der TP-Daten nicht erstellen." << std::endl; 
    std::cout << SavePath.toLocal8Bit().constData() << std::endl; 
    return -1; 
} 


QDataStream out(&file); 
out.setVersion(QDataStream::Qt_4_3); 
out.setByteOrder(QDataStream::LittleEndian); 
out << qint32(10); 

int test=10; 
out.writeRawData((char*)&test,4); 

file.write((char*)&test); 

return 1; 
} 

を私のファイルに出力されている:

0d 0a 00 00 00 0d 0a 00 00 00 0d 0a 

3つの0x0Dのバイトは不要です。ファイルに「9」や「11」を書いているうちに、私はそれらを取得しません。私はアイデアが不足しています。誰かが私が間違っていることを教えてもらえますか?

+0

あなたが呼び出している[QFile :: write'](http://doc.qt.io/qt-5/qiodevice.html#write-1)オーバーロードでは、nullで終わる文字配列が必要です。あなたのコードは未定義の動作を示します。 –

+0

あなたの答えをありがとう! –

答えて

3

バイナリファイルが必要な場合は、QIODevice :: Textフラグを削除してください。 それ以外の場合は、WindowsのLF(0x0A)シンボルにCR(0x0D)シンボルを追加します。私はそれテキストファイル作られたオープン関数でのQIODevice :: textフラグを追加することにより、

0

ちょうどQtのフォーラムで問題を解決しました。これを削除した後、すべて正常に動作します。

+0

私はあなたの考えを理解しようとしています:恐らく意識的に 'Text'フラグを*バイナリ*ファイルに追加しました。:) –

関連する問題