免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1391 | 回复: 9
打印 上一主题 下一主题

C++文件操作问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-17 22:31 |只看该作者 |倒序浏览
通过大家的帮助和自己的研究,上次的问题解决了一些但不是全部,这里列出更具体的问题,请大家指教
(上次的问题中,string是变长,但是不影响数据读写,用sizeof(string)就可,但不知道原理,有高手指点一下么?)
代码:
class Data
{
public:
   list < string >; data ;
};

int main()
{
     list<string>;::iterator Iter ;
     string str;
     Data d ;
     fstream FileIO( "aaa.dat" , iosut | ios:in ) ;

     d.data.push_back("Li" ;
     d.data.puch_back("Zhang";
     d.data.puch_back("Liu";

     for(Iter= d.data.begin() ; Iter!=d.data.end() ; Iter++)
     {
          FileIO( (const char*) ( &(*Iter) ) , sizeof(string) ) ;
     }//调试时,这里只写了3次,没错
   
    FileIO.seekg(0) ;
     
      while ( FileIO && !FileIO.eof() )//用FileIO.good()也是一样的
      {
             FileIO.read( (char*) ( &str ) , sizeof(string) ) ;
             cout << str << endl ;
       }

       FileIO.close() ;
}

输出结果:
Li
Zhang
Liu
Liu
这里多输出了一次Liu,调试时读文件时也是读了4次,不知为什么呀,明明写了3个数据呀?   为了正确的读出数据,我必须加一个计数器。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2004-12-18 11:10 |只看该作者

C++文件操作问题

  1. FileIO( (const char*) ( &(*Iter) ) , sizeof(string) ) ;
复制代码
这是怎么回事?

论坛徽章:
0
3 [报告]
发表于 2004-12-18 11:20 |只看该作者

C++文件操作问题

sizeof(string)
====
这样用会有问题的。

论坛徽章:
0
4 [报告]
发表于 2004-12-18 20:35 |只看该作者

C++文件操作问题

sizeof(string)没有问题呀,很好呀

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2004-12-18 22:23 |只看该作者

C++文件操作问题

我的问题...?

论坛徽章:
0
6 [报告]
发表于 2004-12-18 23:28 |只看该作者

C++文件操作问题

呵呵。单纯的sizeof(string)当然可以运行了,但你想过没有这其中的问题?我估计THEBEST想的跟我一样。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2004-12-19 22:15 |只看该作者

C++文件操作问题

[quote]原帖由 "assiss"]呵呵。单纯的sizeof(string)当然可以运行了,但你想过没有这其中的问题?我估计THEBEST想的跟我一样。[/quote 发表:

我倒不是问它这个sizeof的用法,我是说你那句代码都不完整.
你的代码居然还能出结果?什么编译器啊?
因为你的write(你忘记写了)
  1. for(Iter= d.data.begin() ; Iter!=d.data.end() ; ++Iter)  //最好用++而不是++(int)
  2. {
  3. //FileIO.write((const char*) ( &(*Iter) ) , sizeof(string) ) ; //不需要这么麻烦且不好
  4.   FileIO.write(Iter->;c_str(),sizeof(string));
  5. }
复制代码
sizeof(string)的结果是固定的4.而你用write就必需要保证Iter->;c_str的确包含至少sizeof(string)个字符.而你这里没有保证,所以导致无法预期的后果.异常.....这些话不是对assiss说的哈.   

这样的话,后面的还需要执行么?你的FileIO就直接OVER了下面根本没有一行输出,我不知道你的结果怎么来的,反正我上面什么也没有.而且还异常....

论坛徽章:
0
8 [报告]
发表于 2004-12-20 11:23 |只看该作者

C++文件操作问题

FileIO.write(Iter->;c_str(),sizeof(string));

sizeof(string)?????,这算什么啊?

sizeof(string)的结果是固定的4.而你用write就必需要保证Iter->;c_str的确包含至少sizeof(string)个字符
本来俺是明白的,让你们越说俺越糊涂了,就是有这些字符也被截了,写的也不是需要的信息啊,这么用根本就是错的嘛,编程当然是要解决问题了,如果逻辑都不对,也就是说根本就得不到需要的解,那程序是否能编译通过有很大的意义吗?faint死了

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
9 [报告]
发表于 2004-12-20 13:18 |只看该作者

C++文件操作问题

不管程序写的是如何的差.string并不是这样用的.
你要写入string也是这样用的:
FileIO.read(const_cast<char *>;(str.c_str()), sizeof(string) ) ;
还有最后回答一下楼主的问题,我想这产关键的:
这里多输出了一次Liu,调试时读文件时也是读了4次,不知为什么呀,明明写了3个数据呀?
因为是先读到文件尾才会导致eof被设置.也就是有三个数据:
读一次,再读一次,再读一次,(此时还没有设置EOF)但str中保存的是最后一次(第三次读的数据),接着还是进入while循环,因为还没有设置EOF,所以进行第四次才发现到了EOF,导致第四次任何数据也没有得到,所以str中仍然是第三次得到的数据,所以最后一个数据输出了两次,这个问题前不久有一个人问了.

论坛徽章:
0
10 [报告]
发表于 2004-12-20 14:05 |只看该作者

C++文件操作问题

就是他问的,而且我也已经答过他了,他还在问,faint
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP