一个list读取文件的简单问题

arden1019 2004-11-01 04:05:03
我用下面的函数来将一个formatted文件按行读到一个list中:

bool readftl(char *m_filename,list <char *> m_flist)
{
char rowdata[256];
//int rowindex=0;
fstream listfile;
listfile.open(m_filename,ios::in);

while(!listfile.eof())
{
listfile.getline(rowdata,256,'\n');
//cout<<rowdata<<endl;
m_flist.push_back(rowdata);
//cout<<"\nflist : "<<m_flist.front()<<endl;
}
for (flistitor=m_flist.begin();
flisritor!=m_flist.end();
++flistitor) {
// dereference the iterator to get the element
cout << *flistitor << endl;
}
return true;
}

其中的flist : list<char*> flist;
flistitor: list<char*>::iterator flistitor;

为什么我的cout << *flistitor << endl; 不能正确显示出文件的内容???

我用把flist和flistitor 都按参数传进来么?我已经在整个程序的区域声明了他们。
...全文
146 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
arden1019 2004-11-04
  • 打赏
  • 举报
回复
还按错的来说:

我 list<char*> flist;
list<char*>::iterator flistitor; 以后,要取得一个list中的数据,我*flistitor后应该得到的是 char* ,对不? 那我改为 **flistitor 能不能得到char*指向的数据呢?

那个char rowdata[256]; 我是应该把它改成 char *rowdata=new char[256];我改过来后,cout<<**flistitor 仍然是空的。
如果我把//cout<<"\nflist : "<<m_flist.front()<<endl;的注释去掉,它倒是能显示出正确的数据。
这能说明我已经把文件的数据读到list中了吧?
为什么?难道
for (flistitor=m_flist.begin();
flisritor!=m_flist.end();
++flistitor) {
// dereference the iterator to get the element
cout << *flistitor << endl;
有问题?不该这样遍历一个list么?

arden1019 2004-11-04
  • 打赏
  • 举报
回复
to :freefalcon 能不能让我把你放到我的msn名单中?
我的是arden1019@hotmail.com
arden1019 2004-11-04
  • 打赏
  • 举报
回复
oooooo哦..........我明白了,哈哈大彻大悟哈哈哈哈爽。
carylin 2004-11-04
  • 打赏
  • 举报
回复
同意,用list<string>管理好了
freefalcon 2004-11-04
  • 打赏
  • 举报
回复
晕,先写好了,在提交时又没了
这次说简单点

原因就是,你只申请了一块内存,list存的是指向这块内存的指针,你每次push的都是同一个指针,于是list里的元素都指向同一块内存,此乃问题1。
问题2在于你没次读取文件用的仍然是同一块内存,所以后读取的数据就覆盖了前面的值,这样不会有问题吗?
Squall1009 2004-11-02
  • 打赏
  • 举报
回复
转指针的话强烈建议使用vector效率比list高
arden1019 2004-11-02
  • 打赏
  • 举报
回复
让我来试试....看
freefalcon 2004-11-01
  • 打赏
  • 举报
回复
前面已经说了

这里再提一点,STL容器都是值语义的,即容器是用来装对象,而不是用来装指针,尽管后者可行,但你务必要小心谨慎,自己做好内存管理

既然是基于对象,那么这里如果用string来作为list的元素就不存在任何问题,关键代码
list<string> flist;
string line;
getline(listfile, line);
flist.push_back(line);
goodluckyxl 2004-11-01
  • 打赏
  • 举报
回复
楼上的说的应该是关键

只能用重新申请的办法

静态的都不能用
oo 2004-11-01
  • 打赏
  • 举报
回复
listfile.getline(rowdata,256,'\n');
//cout<<rowdata<<endl;
m_flist.push_back(rowdata);
========================================
rowdata是个局部数组,你所有的节点保存的都是一样的,
而且退出这个函数后,里面的内容是随机的。

应该这样:
把前面的rowdata定义去掉;
char *rowdata = new char[256];
listfile.getline(rowdata,256,'\n');
//cout<<rowdata<<endl;
m_flist.push_back(rowdata);

另外要注意,你在把list删除前,别忘了 delete[];

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧