Unsolved How to make QFile read the whole line
-
I am writing a line of data in a file which has "NUL" inbetween them . I want QFile to read the data fully without stopping at the "NUL". Now it stops at the "NUL" position but i dont want it to stop there and read the whole data is it possible?
-
Sure it's possible, can you show us the code you are using to read the file?
-
How are you determining
QFile
is stopping at thechar( 0 )
? If you're using a(const) char[]
, astd::string
orQString
any character after0
won't be displayed even if set, as0
is the string terminator. Are you sure the data is not loaded or could it be is is simply not displayed? -
file.read(checksum,32); // Actually first 32 byte are checksum and the remaining are data qDebug("Data %s",checksum); file.seek(33); size_of_file = file.size() - 33; qDebug("FILESIZE %d",size_of_file); fileData = file.read(size_of_file); qDebug("FILEDATA %s",fileData.data()); qDebug("FILEDATA1 %s",fileData.data()); FileHashData= QCryptographicHash::hash(fileData, QCryptographicHash::Md5); qDebug() << FileHashData.toHex();
-
All the types are missing there. What type is
fileData
? ho do you openfile
? -
@ManiRon said in How to make QFile read the whole line:
file.read(checksum,32); // Actually first 32 byte are checksum and the remaining are data qDebug("Data %s",checksum); file.seek(33); size_of_file = file.size() - 33;
If your checksum is 32 bytes it occupies bytes #0 to #31 inclusive (like an array). You then seek to 33. Just to verify, that means you are "skipping" 1 byte at offset 32 in the file. Is that really what you intend?
-
its a single line data i have taken sreenshot like this . After the data 61 the next starts as d2.
As per the above image the file read reads till A.,?E>t1?dWQA.,DE_??n1?d7be1526df618c0c4d1bab3959adb65ada9f20bd969493e532a7861d29bc6e698
-
-
@VRonin int cRetVal = 0;
int cRetVal = 0; QByteArray FileHashData, fileData; char checksum[32]; qint64 size_of_file; strUserName = ui->le_Username->text(); m_usrname = ui->le_Username->text(); char carrUsrPwdHash[65] = {"\0"}; QString UsrPwdHash; QFile file("userpass"); if (file.open(QIODevice::ReadOnly)) { file.read(checksum,32); qDebug() << checksum; file.seek(33); size_of_file = file.size() - 33; fileData = file.read(size_of_file); qDebug("FILEDATA %s",fileData.data()); FileHashData= QCryptographicHash::hash(fileData, QCryptographicHash::Md5); qDebug() << FileHashData.toHex(); }
-
@ManiRon
in that image b5afa24a9fa264a178f5ae63c7eff6cf this is my checksum after that a Nul character is there after which my actual data starts -
@ManiRon
OK, in that case it sounds right if it is followed by a "Nul". Personally I would put a comment into your code then to explain that is why you are seeking to byte #33.I don't see anything which would stop at a NUL in your code. What makes you think it is doing so? Are you just relying on the output of
qDebug("FILEDATA %s",fileData.data());
and thinking that shows it has not read past a NUL, that may be an artefact of howqDebug()
displays the data? Try debugging out the length of the data? -
@JonB Actually my requirement is to calculate checksum for the data and store it in the same file where the data i am writing to . So i planned to write the checksum at the begining and followed by the data.
Now when i start the application i will validate the file by reading the checksum stored in file and compare it with the remaining data in file by calculating checksum for them .
Note the stored checksum is calculated using the data and not the whole file
-
could you replace
fileData = file.read(size_of_file);
with :fileData.resize(size_of_file); const auto actualRead = file.read(fileData.data(),size_of_file); Q_ASSERT(actualRead==size_of_file);
-
@VRonin said in How to make QFile read the whole line:
actualRead
I tried sir but i am getting this kind of error
-
@ManiRon It's not hard to fix:
const qint64 actualRead = file.read(fileData.data(),size_of_file);
-
-
@VRonin but thsi doest read the full data
-
No sir i checked the read by removing the NUL from the data in the file and i was able to see that it read the whole data and qDebug() was displaying the full data
This is the whole data when i removed the NUL : " WQA.,?E>t1?dWQA.,DE_??n1?d7be1526df618c0c4d1bab3959adb65ada9f20bd969493e532a7861d29bc6e698{TB.)?V1??n1?dS[H21?z7_??n1?d340819615bcd7cb87459cac37070456eb0af53716c1f0064c4771857728d3777 "
-
But when the data conatins NUL the data will be " WQA.,?E>t1?dWQA.,DE_??n1?d7be1526df618c0c4d1bab3959adb65ada9f20bd969493e532a7861d29bc6e698 "
-
@ManiRon said in How to make QFile read the whole line:
but thsi doest read the full data
What is the output of
qDebug() << actualRead << size_of_file;
?