QQ登录

只需一步,快速开始

搜索
【活动】边做笔记边学习,还能赢取奖学金!
查看: 86|回复: 2

同时读写文件

[复制链接]

尚未签到

最佳答案
0 
发表于 2017-8-12 00:34:58 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 luckstudent 于 2017-8-12 00:36 编辑

int main()
{
    fstream inOut("C:\\Users\\lucks\\Desktop\\C++\\text.txt", fstream::ate | fstream::in | fstream::out);
    size_t cnt = 0;
    string line;
    auto endMark = inOut.tellg();
    inOut.seekg(0, fstream::beg);
    while(getline(inOut, line) && inOut && inOut.tellg() != endMark)
    {
        cnt = line.size() + 1;
        auto tempmark = inOut.tellg();
        inOut.seekp(0, fstream::end);
        inOut << cnt;
        if(tempmark != endMark)
            inOut << " ";
        inOut.seekg(tempmark);
    }
    inOut.seekp(0, fstream::end);
    inOut << "\n";
    return 0;
}
txt文档末输出每行字符数,但结果错误。求指点 QQ图片20170812003029.png QQ图片20170812003201.png
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
累计签到:12 天
连续签到:12 天
最佳答案
11 
发表于 2017-8-12 10:02:04 | 显示全部楼层
在我的试验中是没有问题的:
  1. #include <iostream>
  2. #include <fstream>

  3. using namespace std;

  4. int main() {
  5.     fstream inOut("inout.txt", fstream::ate | fstream::in | fstream::out);
  6.     size_t cnt = 0;
  7.     string line;
  8.     auto endMark = inOut.tellg();
  9.     inOut.seekg(0, fstream::beg);
  10.     while (getline(inOut, line) && inOut && inOut.tellg() != endMark) {
  11.         cnt = line.size() + 1;
  12.         auto tempmark = inOut.tellg();
  13.         inOut.seekp(0, fstream::end);
  14.         inOut << cnt;
  15.         if (tempmark != endMark)
  16.             inOut << " ";
  17.         inOut.seekg(tempmark);
  18.     }
  19.     inOut.seekp(0, fstream::end);
  20.     inOut << "\n";
  21.     return 0;
  22. }
复制代码

其中的 inout.txt 文件内容如下:
  1. line1: hello
  2. line2: world!!!
  3. line3: 012314
  4. line4: 01231484
  5. line5: 012314484
复制代码

注意最后留了个空行,输出结果如下:
  1. line1: hello
  2. line2: world!!!
  3. line3: 012314
  4. line4: 01231484
  5. line5: 012314484
  6. 13 16 14 16
复制代码

当然我把 inout.txt 的换行存为 unix-style,也就是 LF 而不是 CRLF,所以第一行统计的数目为13。

你的统计结果有问题我估计是修改后没有即时保存。我用的比较简单的vscode编辑器,即时观察输出效果:
20170812100112.png

1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!

尚未签到

最佳答案
0 
 楼主| 发表于 2017-8-12 10:28:29 | 显示全部楼层
我原来是Code::Blocks写的 换成VS2013也没问题。感觉是Code::Blocks自身的问题。看下面代码
  1. int main()
  2. {
  3.     fstream inOut("C:\\Users\\lucks\\Desktop\\C++\\text.txt", fstream::ate | fstream::in | fstream::out);
  4.     fstream out("C:\\Users\\lucks\\Desktop\\new.txt", fstream::out);
  5.     int cnt = 0;
  6.     string line;
  7.     auto endMark = inOut.tellg();
  8.     inOut.seekg(0, fstream::beg);
  9.     while(getline(inOut, line) && inOut && inOut.tellg() != endMark)
  10.     {
  11.         /*auto tempMark = inOut.tellg();
  12.         inOut.seekp(0, fstream::end);
  13.         inOut.seekg(tempMark);*/
  14.         cnt = line.size() + 1;
  15.         out << cnt << line << endl;
  16.     }
  17.     return 0;
  18. }
复制代码


此程序的就是把源文档的每行字符个数加字符输出到新的文档中去。如果没有注释部分,能出来正确结果。但是如果把注释部分加上去,那么Code::Blocks就出问题了,VS2013还是正确的。有大神能输出具体原因么。
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /2 下一条

小黑屋手机版Archiver( 粤公网安备 44051102000370号 | 粤ICP备11014136号

© 2010-2017 FishC.com GMT+8, 2017-8-21 03:15 Powered by Discuz! X2.5 Theme by dreambred

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