C++primer第五版流随机访问部门的例程,然而有好多问题
先上代码
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
int main(){
fstream inOut("hello",fstream::ate|fstream::in|fstream::out);
if(!inOut){
cerr<<"Unable to open file!"<<endl;
return EXIT_FAILURE;
}
auto end_mark =inOut.tellg();
inOut.seekg(0,fstream::beg);
cout<<"BEG"<< fstream::beg<<endl;
cout<<"cur"<<fstream::cur<<endl;
cout<<"end"<<fstream::end<<endl;
size_t cnt = 0;
string s;
while(inOut&&inOut.tellg()!=end_mark&&getline(inOut,s)){
cout<<s<<endl;
auto mark = inOut.tellg();
cnt += (s.size()+1);//+1表示换行符
inOut.seekp(0,fstream::end);
inOut<<cnt<<","<<mark;
if (mark!=end_mark) inOut<<" ";
inOut.seekg(mark);
}
inOut.seekp(0,fstream::end);
inOut<<"\n";
//上面是原例程,下面是为了看文件内容加的
string temp;
inOut.seekg(0,fstream::beg);
while(getline(inOut,temp)){
cout<<temp<<","<<inOut.tellg()<<endl;
}
return 0;
}
再上文件内容:
abcd
efg
hi
j
再上结果
跟书上的结果完全不一样啊,程序本来应该删除每一行末跟初始位置的相对位置的(书上是5 9 12 14),但是我的完全不对啊
分析下我的结果(为了研究getline我在开头加了一个换行,后面细说)
因为我运行了好几次所以最下面有三行
三行数字中,逗号前面的数字是应该要输出的,第一次运行结果可以看到是1 2 3 4,这非常明显是上面我手动增加的1,也就意味着在读取第一个换行以后,getline读到的内容长度都是0(但是它又能进循环),第二次跳过直接看第三次,这次他在第二次getline读到了fg所以增加了3,后面同理。。
输出了一下我发现问题是处在哪个getline的流位置上,由数据可以看出来除了第一个的位置比较奇怪后面的都是按照哪个相对值进行递增的,所以现在最大是问题也就在那个getline的流位置
每次运行第一个getline的流位置都不一样且递增
明明只有一个换行为什么返回的位置有这么大的值
还有就是几乎以同样的操作读文件上面的例程出现了问题而我在下面读取并输出文件内容的时候没问题(问题出在那个mark吗,可我是按例程敲的)
还有我发现用完getline(inOut,s)再看gcount值是0的,然后查了一下他的这个重载形式是在string头文件里的,所以不会计算它的输入个数是吗?
还有就是那个fstream::end为什么始终是2啊,是不能这样输出吗
研究了一晚上了,好痛苦,求大神解答。
有描述不清的请指出