文件输入输出输出文件的最后一行重复无限次多次

时间:2014-09-12 03:47:32

标签: c++

所以我遇到的问题是它将最后一行复制到numbers2.txt文件中无限次。 idk y它发生像tat一样它应该在实现移动两个字节后停止仅仅会导致它到达eof标记

这是代码

#include <iostream>
#include <fstream>
#include<string>

using namespace std;

string conversion(int);

int conversion2(string);

int main()
{
  string initialnumber;
  fstream sample("numbers.txt", ios::in | ios::out);
  ofstream sample2("numbers2.txt");

  if (sample && sample2) {
    int number2;
    string roman;
    int number;
    char ch;

    //cout << ch;
    while (!sample.eof()) {
      sample.get(ch);

      //cout << "OK" << " ";
      if (ch != '1' && ch != '2' && ch != '3' && ch != '4' && ch != '5' && ch != '6'
          && ch != '7' && ch != '8' && ch != '9') {
        sample.seekg(-1L, ios::cur);
        sample >> roman;
        sample.seekg(2L, ios::cur);
        sample2 << roman << " " << conversion2(roman) << endl;
        //cout << conversion2(roman) << " " << roman;
        //cout << "OK";
        int L = sample.tellp();
        cout << L;

      } else {
        sample.seekg(-1L, ios::cur);
        sample >> number2;
        sample2 << conversion(number2) << " " << number2 << endl;
        sample.seekg(2L, ios::cur);
        //int l = sample2.tellp();
        //cout << l << " ";
        //cout << "OK";
      }
    }

  } else {
    cout << "fail";
  }

  sample.close();
  sample2.close();
}

1 个答案:

答案 0 :(得分:1)

我的上述评论对于清除failbiteofbit不正确(仅seekg的单个参数重载清除eofbit),seekg设置{{1}然而,错误,而不是failbit,所以你的循环条件永远不会得到满足。

来自[istream.unformatted]

eofbit
  

效果:表现为无格式输入函数(如27.7.2.3第1段所述),不同之处在于它不计算提取的字符数,也不影响后续调用gcount()返回的值。构造一个哨兵对象后,如果fail()!= true,则执行rdbuf() - &gt; pubseekoff(off,dir,ios_base :: in)。 如果失败,该函数调用setstate(failbit)(可能会抛出ios_base :: failure)。

将您的条件更改为basic_istream<charT,traits>& seekg(off_type off, ios_base::seekdir dir); 甚至更好while (!sample.fail())以测试任何流错误,或while (sample)在第一次读取错误时中止。