2016-11-13 5 views
0
#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는이 오류가 잘못된 방식으로 메모리에 액세스함으로써 발생한다고 말합니다. 이 코드를 한 시간 동안 확인했는데 문제의 원인을 파악할 수 없습니다. 저는 오늘 하천을 공부하기 시작했습니다. 이것은 "프로그래밍 - C++을 사용하는 원리와 실습 (제 2 판)"제 10 장에서의 연습입니다.

P. 내 영어 문법에 대한 죄송합니다, 그렇지 최종 값을 반환하는 기능 operator>>(istream& is, Point& p) 리드 코드의 모든 지점은 그래서 당신은 함수의 끝에서 값 return is;을 반환 푸시를 분실하고 있다고 가정 내 모국어)

+0

당신은'''과부하 상태로 들어가서 segfault가 발생하는 곳을 결정해야합니다. –

+0

시간은 매우 짧은 시간입니다. 계속 일해라. 며칠 후에 다시 오십시오. –

+0

좋아요,이 코드를 작성할 때 저는 순수 콘솔을 가지고있었습니다. 위의 조언을 따르고 해결책을 게시 해 드리겠습니다. – SweetYogurt

답변

0

아니다

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; 
    return is; 
} 
+0

예, 저는 C :: B를 썼을 때 정말 빨리 알았습니다. 컴파일러는 즉시 경고를했습니다. 하지만 또 다른 문제가 발생했습니다. 내 오류 처리기가 파일 끝 또는이 같은 것을 인식하지 못했습니다. 디버깅하는 동안 마지막 값이 빨간색 함수 인 >> 함수를 다시 입력하고 "오류 : 잘못된 레코드!"라는 오류를 발견했습니다. \ n 그러나 모든 값은 올바르게 빨간색으로 벡터에 저장됩니다. 우선, 나는 (ist >> p)가 거짓이되는 동안 EOF에 도달했을 때 그것을 생각했다. 둘째, if (ch >> ch && ch! = '(')는 프로그램이 두 번째에 도달하지 못하게해야합니다. – SweetYogurt