0

以下は私のコードです

ifstream& operator>>(ifstream &input,Line3D &line3d)
{
int x1,y1,z1,x2,y2,z2;
x1=0;
y1=0;
z1=0;

x2=0;
y2=0;
z2=0;

//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);


//cout << x1 << "," << y1 << "," << z1 << "," <<endl;
//cout << x2 << "," << y2 << "," << z2 << "," <<endl;


Point3D pt1(x1,y1,z1);
Point3D pt2(x2,y2,z2);

line3d.setPt1(pt1);
line3d.setPt2(pt2);

line3d.setLength();
}

私の cout 、上記の 2 cout にコメントすると、この奇妙な問題があります。私のコードは機能しませんが、コメントを外すとコードは機能します..ターミナル出力はこちらです..

Please enter your choice: 1

Please enter filename: messy.txt
10 records read in successfully!
Going back to main menu ...

しかし、私がcoutのコメントを外すと...

選択肢を入力してください: 1

Please enter filename: file.txt
7,12,3,
-9,13,68,
7,-12,3,
9,13,68,
70,-120,-3,
-29,1,268,
25,-69,-33,
-2,-41,58,
9 records read in successfully!
Going back to main menu ...

9 レコードが正しいレコードです。しかし、なぜカウトが私のコードの問題を解決するのでしょうか。端末に出力するだけだと思っていました。私はここで何を間違えましたか。

これはテキストファイルの内容です

Point2D, [3, 2]
Line3D, [7, 12, 3], [-9, 13, 68]
Point3D, [1, 3, 8]
Line2D, [5, 7], [3, 8]
Point2D, [3, 2]
Line3D, [7, -12, 3], [9, 13, 68]
Point3D, [6, 9, 5]
Point2D, [2, 2]
Line3D, [70, -120, -3], [-29, 1, 268]
Line3D, [25, -69, -33], [-2, -41, 58]
Point3D, [6, 9, -50]

端末から欲しい正しい応答は

Correct output: 9 records read in successfully 
Reason: as 10 means the value fail to record to vector. and duplicate is not removed.

すべてのガイドに感謝します。正しい出力を維持し、cout を削除するにはどうすればよいですか。

main.cpp の私のコードの詳細:

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,25,',');

Line3D line3d_tmp;
readFile>>line3d_tmp;

done=true;

//some for loop to check for duplication
//done will be false if doesnt work

if(done==true)
{
line3d.push_back(line3d_tmp);

}

したがって、値が私のベクターに push_back であるかどうかがわかります。同じ値の 2 つのレコードを意図的に配置したため、重複したレコードが削除されます。問題は、2 cout ラインを使用する場合です。レコードは 9 (1 行の重複があるので正しい) と表示され、2 回目の実行で同じファイルを入力します。0 レコードが読み取られています..

しかし、2回目の実行でカウントをコメントアウトすると、再び4レコードが読み取られます。最初の実行は 10 レコードでした。

4

1 に答える 1

1

いくつかのポイント:

  • ifstreamに変更istream
  • input演算子の最後に戻ります
  • operator>>()forを定義しPoint3Dて使用するLine3D
于 2012-11-15T10:18:28.483 に答える