关于Qt QFileDevice::map()接口的一些学习记录
最近在做一個(gè)類似于寫日記的程序,想法是左邊一列tableview用來顯示所打開的文件夾下的日志文件
右邊一個(gè)textEdit用來顯示單擊日志條目時(shí)顯示對應(yīng)日志文件,另外可以保存所有日志文件顯示時(shí)的狀態(tài)。
最開始想的是通過map接口來進(jìn)行文件映射(對文件映射不熟悉所以使用它)
?
在建立關(guān)聯(lián)文件映射的時(shí)候,發(fā)現(xiàn)如果是新建文件,則映射建立失敗
如果是舊文件但如果文件中無內(nèi)容,也會失敗
?
經(jīng)過測試和排查,發(fā)現(xiàn)接口
uchar *QFileDevice::map(qint64 offset, qint64 size, MemoryMapFlags flags = NoOptions)?map的意思就是將文件從offset位置開始,到size字節(jié)的數(shù)據(jù)映射到內(nèi)存中(但是size的大小也沒有規(guī)定誒)
當(dāng)時(shí)想的是,對內(nèi)存映射進(jìn)行修改然后文件也會對應(yīng)修改,就比較爽了賽。
結(jié)果
1 try{ 2 if(!item->m_file.isOpen()){ 3 item->m_file.setFileName(item->FilePath); 4 item->m_file.open(QIODevice::ReadWrite); 5 item->m_pvFileBuffer = item->m_file.map(0, item->Size); 6 7 if(item->m_pvFileBuffer == NULL){ 8 //qDebug() << item->m_file.error() ; 9 if(item->m_file.isOpen()) 10 item->m_file.close(); 11 } 12 } 13 }catch(...){ 14 item->m_file.unmap(item->m_pvFileBuffer); 15 item->m_pvFileBuffer = NULL; 16 if(item->m_file.isOpen()) 17 item->m_file.close(); 18 } View Code
這樣子是建立不了內(nèi)存映射的。
后來在之前增加以下函數(shù),或者是先寫入數(shù)據(jù)或者是先初始化文件一個(gè)固定大小,map才能映射成功
//newFile.write(" ");//初始化新文件,否則建立映射會失敗 newFile.resize(100);?
所以如果用map做這個(gè)日志功能,比較麻煩
它不能實(shí)現(xiàn)文件自增長,如果你給定了一個(gè)初始化大小size,在文件大小達(dá)到這個(gè)size的時(shí)候,你需要重新建立map,否則會失敗。
?
以上是map這個(gè)接口遇到的問題,現(xiàn)在在想怎么來做這個(gè)功能,有網(wǎng)友看到的話可以提供一點(diǎn)建議?謝謝
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/warmSnowFY/p/10505552.html
總結(jié)
以上是生活随笔為你收集整理的关于Qt QFileDevice::map()接口的一些学习记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 统计学习方法 学习笔记(十):决策树
- 下一篇: onBlur()事件连续触发问题。