• 6156阅读
  • 6回复

[提问][已解决]求助文件的读写 [复制链接]

上一主题 下一主题
离线septem8918
 
只看楼主 倒序阅读 楼主  发表于: 2011-04-16
有一个文件PhoneBook.dat,里面是之前用QDataStream的>>命令分别写入了一串数据(out<<联系人总数<<联系人1编号<<联系人1姓名<<联系人1号码<<联系人2编号...)。
现在我想修改里面某项的内容,有没有简易的方法呢?

我现在预想的方法是个笨方法:首先读出每一项内容(in>>联系人总数>>联系人1编号>>联系人1姓名>>联系人1号码>>联系人2编号...) ,之后修改某一项,再建立一个QDataStream对象把修改和没修改的数据覆盖在原数据上(out<<联系人总数<<联系人1编号<<联系人1姓名<<联系人1号码<<联系人2编号...)。
但是它不是我想的那样覆盖,而是在之前的数据之后加入了这些数据。
比如,原来是:2 01 A 10001 02 B 10002,现在修改联系人1的号码为10000,之后就变成了2 01 A 10001 02 B 10002 2 01 A 10000 02 B 10002。
各位大侠,有什么方法解决吗?
  1. QFile PhoneBook(tr("PhoneBook.dat"));
  2. PhoneBook.open(QIODevice::ReadWrite);
  3. QDataStream in(&PhoneBook);
  4. in>>ContactsAmount;//读取总数
  5. contact NewContact[ContactsAmount];//建立总数个联系人(结构体)数组
  6. for(int i=0;i<ContactsAmount;i++)//读取
  7. {
  8. in>>NewContact.Num>>NewContact.Name>>NewContact.PhoneNum;
  9. }
  10. if(CursorPos==2)//修改姓名或号码
  11. {
  12. NewContact[ContactNum-1].Name=EditStr; Name=EditStr;
  13. }
  14. else if(CursorPos==3)
  15. {
  16. NewContact[ContactNum-1].PhoneNum=EditStr; PhoneNum=EditStr;
  17. }
  18. QDataStream out(&PhoneBook);
  19. out<<ContactsAmount;
  20. for(int i=0;i<ContactsAmount;i++)//写入
  21. {
  22. out<<NewContact.Num<<NewContact.Name<<NewContact.PhoneNum;
  23. }


[ 此帖被septem8918在2011-04-18 21:28重新编辑 ]
离线jdwx

只看该作者 1楼 发表于: 2011-04-16
还是用数据库吧!
如果数据少可以用带分隔符的文本文件:
QTextStream读写文件(数据按行存储)
QString::Split()分解每行数据(每行数据顺序固定)
QList存储数据(定义一个数据类)
修改数据。
存储到文件。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线dbzhang800

只看该作者 2楼 发表于: 2011-04-16
问题的根源在于 文件操作不熟:
以读写方式打开文件,然后读啊读,读完后,又写啊写。显然就是你看到的结果了。

至于如何解决,我就不说了(只要你操作文件,无论是C的接口FILE,C++的接口fstream,还是Qt的QFile,概念上都是完全一样的)
离线septem8918
只看该作者 3楼 发表于: 2011-04-17
回 1楼(jdwx) 的帖子
多谢,我试试这个方法,按行存储是个好方法
离线septem8918
只看该作者 4楼 发表于: 2011-04-17
回 2楼(dbzhang800) 的帖子
谢了,如果读写操作看作一个指针从前往后读,读到最后,读操作结束,之后开始写,指针继续往后移,就出现我之前的情况,那有什么方法可以让这个指针读完之后回到最前面的位置再进行写操作呢?
离线dbzhang800

只看该作者 5楼 发表于: 2011-04-17
Re:回 2楼(dbzhang800) 的帖子
引用第4楼septem8918于2011-04-17 13:36发表的 回 2楼(dbzhang800) 的帖子 :
谢了,如果读写操作看作一个指针从前往后读,读到最后,读操作结束,之后开始写,指针继续往后移,就出现我之前的情况,那有什么方法可以让这个指针读完之后回到最前面的位置再进行写操作呢?

呵呵,不用想太多,QDataStream想成透明的就行了,QFile 的 当前pos 在哪儿,QDataStream 就操作哪儿。至于如何设置QFile的pos,我想你应该知道的
离线septem8918
只看该作者 6楼 发表于: 2011-04-17
Re:Re:回 2楼(dbzhang800) 的帖子
引用第5楼dbzhang800于2011-04-17 14:17发表的 Re:回 2楼(dbzhang800) 的帖子 :
呵呵,不用想太多,QDataStream想成透明的就行了,QFile 的 当前pos 在哪儿,QDataStream 就操作哪儿。至于如何设置QFile的pos,我想你应该知道的  

问题解决了,我之前以为读写位置是跟QDataStream有关系呢,非常感谢
快速回复
限100 字节
 
上一个 下一个