viggo96 2016-01-15 16:54 采纳率: 0%
浏览 1514
已结题

C++流位置和getline的问题

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

有描述不清的请指出

  • 写回答

2条回答 默认 最新

  • viggo96 2016-01-15 17:00
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 用三极管设计—个共射极放大电路
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示