#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
struct Point
{
double x;
double y;
};
istream& operator>>(istream& is, Point& p)
{
char ch;
if(is >> ch && ch != '(')
{
is.unget();
is.clear(ios_base::failbit);
return is;
}
char ch2;
double x;
double y;
is >> x >> ch >> y >> ch2;
if(!is || ch != ';' || ch2 != ')')
{
cerr << "Error: Bad record!\n";
exit(1);
}
p.x = x;
p.y = y;
}
ostream& operator<<(ostream& os, const Point& p)
{
return os << '(' << p.x
<< ';' << p.y << ')' << endl;
}
int main()
{
Point p;
vector<Point> original_points;
cout << "Please enter 3 points:\n";
for(int i = 0; i < 3; ++i)
{
cin >> p;
original_points.push_back(p);
}
cout << "\nYou've entered:\n";
for(Point x : original_points)
cout << x;
ofstream ost{"mydata"};
for(Point x : original_points)
ost << x;
ost.close();
vector<Point> processed_points;
ifstream ist{"mydata"};
while(ist >> p)
processed_points.push_back(p);
ist.close();
cout << "original_points: ";
for(Point x : original_points)
cout << x;
cout << "processed_points: ";
for(Point x : original_points)
cout << x;
if(original_points.size() != processed_points.size())
cout << "Oops! Seems like something went wrong!\n";
return 0;
}
デバッグした後、私はエラーがこのコード行によって引き起こされることを考え出した:セグメンテーションフォールト読み取りファイル
while(ist >> p)
は、コードのこの部分は、本からコピーされたほぼ100%:
istream& operator>>(istream& is, Point& p)
{
char ch;
if(is >> ch && ch != '(')
{
is.unget();
is.clear(ios_base::failbit);
return is;
}
char ch2;
double x;
double y;
is >> x >> ch >> y >> ch2;
if(!is || ch != ';' || ch2 != ')')
{
cerr << "Error: Bad record!\n";
exit(1);
}
p.x = x;
p.y = y;
}
Googleとstackoverflowは、このエラーは間違った方法でメモリにアクセスすることによって発生したと言います。私はこのコードを1時間チェックしていましたが、何が問題を引き起こすのか理解できません。私は今日ストリームを勉強し始めました。これは「Programming - C++を使った原則と実践(第2版)」の第10章での演習です。
P.S.私の英語の文法のため申し訳ありませんが、それは私の母国語ではありません)機能operator>>(istream& is, Point& p)
リードでコードの
あなたの '' 'オーバーロードに入り、segfaultの発生場所を判断する必要があります。 –
時間は非常に短い時間です。それを続けてください。数日後に戻ってください。 –
さて、私はこのコードを書いていたときに純粋なコンソールを持っていました。私は上記のアドバイスに従い、うまくいけば解決策を投稿します。 – SweetYogurt