找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1697|回复: 8

[讨论]请教高手seekg(0), 为什么不好用了??

[复制链接]
发表于 2009-10-31 01:05:45 | 显示全部楼层 |阅读模式 IP:江苏扬州
#include<iostream.h>//cout #include<fstream.h> //fstream
int main(int argc,char * *argv)
{ int i(0); int num[20]; char buffer[100]; ifstream myf(argv[1],ios::nocreate);
while(!myf.eof()) { myf.getline(buffer,100,'\n'); i++; } cout<<i<<endl;//i表示文件的行数 for(int j(0);j<20;j++) num[j]=0; for(int m(0);m<20;m++) { myf.seekg(0);//此处的seekg(0)不起作用,用myf.seekg(0,ios::beg)也不起作用 // 为什么不能把指针指向文件流的开始
while(!myf.eof()) { myf.getline(buffer,100,'\n'); num[m]++; } cout<<num[m]<<" ";//再次输出文件的行数 }
return 0; } 我找个一个56行的文件实验
运行的结果为:
56
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
为什么在for中的seekg(0)不起作用呢??
发表于 2009-10-31 01:05:46 | 显示全部楼层 IP:江苏扬州
file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节 那个0是偏移量呢,不是定位位置。
http://www.hktk.com/soft/program/article/cbuilder/cbuilder521.html
回复

使用道具 举报

发表于 2009-10-31 01:05:47 | 显示全部楼层 IP:江苏扬州
高手,我知道seekg(0)中的0是偏移量,不是这个问题。seekg(0)和seekg(0,ios::beg)是一样的ios::beg是默认的参数。seekg(0)和seekg(0,ios::beg)都是表示将文件流的指针从头开始移动0个指针(也就是指向文件的头部)。这一点以下程序可以说明。
#include<iostream.h>//cout #include<fstream.h> //fstream #include<conio.h> //getche() #include<stdlib.h>//remove
int main(int argc,char * *argv)
{ int i(0),j(0),p(0); int num[20]; char buffer[100]; ifstream myf(argv[1],ios::nocreate);
while(!myf.eof()) { p++; myf.getline(buffer,100,'\n'); i++; if(p==40) break; } cout<<i<<endl;//i表示文件的行数 myf.seekg(0);//这个seekg(0)起了作用 while(!myf.eof()) {
myf.getline(buffer,100,'\n'); j++; } cout<<j<<endl; for(int k(0);k<20;k++) num[k]=0; for(int m(0);m<20;m++) { myf.seekg(0); while(!myf.eof()) { myf.getline(buffer,100,'\n'); num[m]++; } cout<<num[m]<<" "; }
return 0; } 运行的结果为
40
56
0 0 0。。。。。。
这个程序还说明当myf.eof()=1的情况下 seekg就失效了, 你说的seekg(-200,ios::cur)也起不了作用。我现在想问用什么方法可以改变使seekg重新起作用。或者怎样改变myf.eof的值,是不是改变以后(我不知道怎样改变)seekg就能起作用了。
回复

使用道具 举报

发表于 2009-10-31 01:05:48 | 显示全部楼层 IP:江苏扬州
噢~~~晕~~~你问倒我了,我也是初学者,在研究MFC中……
不好意思,帮不到,不过我不会放弃,我们一起研究一下。
回复

使用道具 举报

发表于 2009-10-31 01:05:49 | 显示全部楼层 IP:江苏扬州
刚才想了好久,暂时得出这样结论:
#include<iostream.h> #include<fstream.h>
void main(int argc,char *argv[]) { int line=0; char buffer[100]; ifstream file("live41.txt",ios::nocreate);
while(!file.eof()) { file.getline(buffer,100,'\n'); line++; } cout<<line<<endl; //以上为第一次 file.seekg(0,ios::beg); //放在外面试一试
while(!file.eof()) //再来一次,结果跳过了循环 { file.getline(buffer,100,'\n'); line++; } cout<<line<<endl; //输出仍然是15没有变化
//以上说明就算把函数放在外面也是不行,不单在循环 //也可能是,函数根本不是这样用的,应该另有用法
for(int m=0;m<20;m++) { int num=0; //这里不用数组浪费空间 file.seekg(0,ios::beg); while(!file.eof()) { file.getline(buffer,100,'\n'); num++; } cout<<num<<" "; } cout<<endl; }
回复

使用道具 举报

发表于 2009-10-31 01:05:50 | 显示全部楼层 IP:江苏扬州
你的这个程序说明什么问题了呀??
我看了,也运行了,但是我说的问题还是存在呀
另外你的头像挺可爱的,呵呵
回复

使用道具 举报

发表于 2009-10-31 01:05:51 | 显示全部楼层 IP:江苏扬州
我是想说,你原来以为问题只是在循环里seekg()就用不了了,但是我在循环外也实现不了把指针指向文件头啊!可能是用得不对了,不过我会继续努力,一齐努力。另外我也有个问题想请教,我的VC只能用seekg()而不能用seekp(),为什么呢?想破头了……
回复

使用道具 举报

发表于 2009-10-31 01:05:52 | 显示全部楼层 IP:江苏扬州
我是说当对同一个文件对象,当file.eof()=1的时候seekg就不好用了,和循环没有什么关系
在循环内和循环外都是一样的。当file.eof()=0的时候seekg是好用的。也就是说当一个文件读到尾部以后,不能再用seekg来移动或者定位了。通过建立该文件新的对象能解决这个问题,但是在需要读文件到尾部的次数非常多的 情况下,我觉得这样不太好。所以想问下,怎么在file.eof()=1的时候怎么让seekg起作用,或者能不能改变file.eof()的值。
另外你说seekp不好用是什么意思??
seekp是ofstream类的函数,不是ifstream的对象
回复

使用道具 举报

发表于 2009-10-31 01:05:53 | 显示全部楼层 IP:江苏扬州
懂了,谢谢,反倒要请教你了,不好意思,呵呵……
我下去再想一下,不要放弃。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 15:31 , Processed in 0.194708 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表