2 viggo96 viggo96 于 2016.01.16 00:54 提问

C++流位置和getline的问题 5C

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啊,是不能这样输出吗
研究了一晚上了,好痛苦,求大神解答。

有描述不清的请指出

5个回答

CSDNXIAOD
CSDNXIAOD   2016.01.16 04:33

c++ Getline()的问题
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

CSDNXIAOD
CSDNXIAOD   2016.01.16 04:34

c++ Getline()的问题
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

CSDNXIAON
CSDNXIAON   2016.01.16 04:34

c++ Getline()的问题
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

viggo96
viggo96   2016.01.16 01:00

还有就是那个fstream::end为什么始终是2啊,是不能这样输出吗

91program
91program   Ds   Rxr 2016.01.16 10:56

fstream::end 是系统定义的,始终是 2 有什么问题?
书上的答案你验证不正确,请你:
1 先再详细的对一个你输入的代码是否是书上的完全一致;
2 输入数据的格式,也需要注意。

viggo96
viggo96 代码是一致的就是mark那个地址,操作完再返回那个位置继续操作。。输入格式方面windows的文本回车是\n+\r的,但是还是不能解决我的问题
接近 2 年之前 回复
viggo96
viggo96 end表示流的末尾,但是始终不变,也就是它存的并不是pos_type类型的位置,是这样吗?
接近 2 年之前 回复
viggo96
viggo96 end表示流的末尾,但是始终不变,也就是它存的并不是pos_type类型的位置,是这样吗?
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!