2010-04-22 5 views
1
QFile msnLogFile(item->data(Qt::UserRole).toString()); 
QDataStream logDataStream; 
    if(msnLogFile.exists()){ 
     msnLogFile.open(QIODevice::ReadOnly); 
     logDataStream.setDevice(&msnLogFile); 
     QByteArray logBlock; 
     logDataStream >> logBlock; 
    } 

이 코드는 작동하지 않습니다. 결과가 비어있는 QByte입니다. char *를 사용하면 똑같은 일이 일어난다. 이상하게도 같은 코드가 다른 프로그램에서 작동합니다. 나는 둘 사이의 차이를 찾기 위해 매매하고있다. 이것은 int, uint, quint8 등을 사용하면 작동합니다.QDataStream 및 QDataStream :: operator >> (char * & s)의 문제

답변

2

msnLogFile이 QDataStream을 사용하여 이전에 생성 된 적이 없다고 가정하면 (이 답변을 완전히 무시한 경우) >> 연산자를 사용하고 싶지 않습니다.

QDataStream이 문자열을 쓰고있을 때 문자열의 길이가 출력 바이트 앞에 추가되기 때문입니다. 이렇게하면 다른 QDataStream이 올바른 길이로 다시 읽으며 동일한 결과를 얻을 수 있습니다. 따라서 int, qint8 등이 올바르게 작동하는 이유는 무엇입니까? 미리 첨부 된 크기가 없습니다. 원시 데이터 일뿐입니다. msnLogFile의 내용이 엄격하게 텍스트 경우

, 당신은 바이너리 데이터의 경우 올바른 순서로 데이터를 다시 QDataStream::readRawData()를 사용하고 읽을 거라고 열고 QIODevice::readLine() 또는 QIODevice::readAll()를 사용하도록 QIODevice::Text 플래그를 전달해야 정확한 크기.

1

프로토콜 버전을 지정하지 않았기 때문에 추측 할 수 있습니다. 다른 버전의 Qt를 사용하는 여러 컴퓨터가 모두 동일한 프로토콜 버전을 사용하도록 setVersion()으로 전화해야합니다.