我希望有人可以将我的代码修改为如此错误。有时它的工作,有时它不..
所以让我解释一下..文本文件数据如下
Line3D, [70, -120, -3], [-29, 1, 268]
Line3D, [25, -69, -33], [-2, -41, 58]
要阅读上述内容..我使用以下
char buffer[30];
cout << "Please enter filename: ";
cin.ignore();
getline(cin,filename);
readFile.open(filename.c_str());
//if successfully open
if(readFile.is_open())
{
//record counter set to 0
numberOfRecords = 0;
while(readFile.good())
{
//input stream get line by line
readFile.getline(buffer,20,',');
if(strstr(buffer,"Point3D"))
{
Point3D point3d_tmp;
readFile>>point3d_tmp;
// and so on...
然后我对Line3d的ifstream进行了重载
ifstream& operator>>(ifstream &input,Line3D &line3d)
{
int x1,y1,z1,x2,y2,z2;
//get x1
input.ignore(2);
input>>x1;
//get y1
input.ignore();
input>>y1;
//get z1
input.ignore();
input>>z1;
//get x2
input.ignore(4);
input>>x2;
//get y2
input.ignore();
input>>y2;
//get z2
input.ignore();
input>>z2;
input.ignore(2);
Point3D pt1(x1,y1,z1);
Point3D pt2(x2,y2,z2);
line3d.setPt1(pt1);
line3d.setPt2(pt2);
line3d.setLength();
}
但问题是某个时候的记录工作,有时它不...我的意思是,如果在这一点
//i add a cout
cout << x1 << y1 << z1;
cout << x2 << y2 << z2;
//its works!
Point3D pt1(x1,y1,z1);
Point3D pt2(x2,y2,z2);
line3d.setPt1(pt1);
line3d.setPt2(pt2);
line3d.setLength();
但是,如果我带走了cout它不起作用。我如何更改我的cin.ignore()以便正确处理数据,考虑数字范围是-999到999
答案 0 :(得分:0)
我无法解释为什么这段代码崩溃了。这可能是因为你有没有在这里发布的bug。但是你会发现编写运算符&gt;&gt;更容易。这样。
istream& operator>>(istream &input,Line3D &line3d)
{
int x1,y1,z1,x2,y2,z2;
char c1,c2,c3,c4,c5,c6,c7;
input >> c1 >> x1 >> c2 >> y1 >> c3 >> z1 >> c4 >> c5 >> x2 >> c6 >> y2 >> c7 >> z2;
Point3D pt1(x1,y1,z1);
Point3D pt2(x2,y2,z2);
line3d.setPt1(pt1);
line3d.setPt2(pt2);
line3d.setLength();
return input;
}
使用虚拟char变量(c1,c2等)读入你不感兴趣的逗号和括号。这种技术也会跳过你不感兴趣的空格。这是一个比使用忽略。
代码中的其他错误是operator>>
应使用istream
而不是ifstream
,最后应该有return input;
。通过编写operator>>
来使用istream
,它将适用于任何类型的输入流(例如,包括cin
),而不仅仅是文件流。