所以我遇到的问题是它将最后一行复制到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();
}
答案 0 :(得分:1)
我的上述评论对于清除failbit
和eofbit
不正确(仅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)
在第一次读取错误时中止。