2013-10-30 2 views
1

나는 뱅킹 프로그램을 수행하고 있으며 입금 기능에 텍스트 파일을 읽고 famount에 금액을 저장하는 다음 코드가 있습니다. 유일한 문제는 프로그램을 실행하고 famount를 출력 할 때 이전 줄이 그 위에있는 줄과 정확히 같은 데이터를 가지고 있다는 것입니다.C++ 루프가 마지막 입력을 두 번 울리지 않게하려면 어떻게합니까?

이것은 코드 부분입니다.

file>>firstname>>lastname; 
cout<<endl<<firstname<<" "<<lastname<<endl; 
string line; 
while (getline(file, line)) 
{ 
    //stringstream the getline for line string in file 
    istringstream iss(line); 
    file>>date>>amount; 
    iss >> date >> amount; 


    cout<<date<<"\t\t"<<amount<<endl; 
    famount+=amount; 

    // I tried to use this to stop reading after 
    // to the file ends but it still reads the last 
    // data on the file twice. 
    if(file.eof()){ 
     break; 
    } 
} 
cout<<famount; 

은 텍스트 파일은 다음과 같습니다

토니 가디스

05/24/12 100

05/30/12 300

07/01/12 - 300

// 콘솔 출력은 다음과 같습니다.

토니 가디스

05/24/12 100

05/30/12 300

07/01/12 -300

07/01/12 -300 //이 여기 있으면 안된다 !!!!!

-200 // 내가이 문제를 해결하기 위해 할 수있는 이유는 무슨 일이 벌어지고 100

발생한다. 미리 감사드립니다.

+3

"중얼 중얼 두 번"->'EOF()'남용. 'eof()'를 사용하지 마십시오. 그것은 말도 안돼. 대신 입력 작업을 확인하십시오. –

+2

'파일 >> 날짜 >> 금액; iss >> date >> amount;'stringstream에서 한 번, 두 번 추출합니다. 왜? – jrok

+0

저는이 코드가 그 입력으로 그 출력을 어떻게 생성하는지 보려고합니다. .. 그리고 나는 아직도 그것을 보지 않고있다. 만약 내가 당신이 원하는 것보다 * 적은 * 데이터를 출력하기를 기대한다면, 특별한 이유없이 다른 특별한 이유없이, 파일을 추가 할 때 분명히 무시한 루프 내부의 파일 >> 날짜 >> 양 >> 내부 * 라인 처리. 잠깐 ... 이제 나는 그것을 본다. – WhozCraig

답변

1

당신은 아마로 코드를 변경하려는 것 :

file>>firstname>>lastname; 
cout<<endl<<firstname<<" "<<lastname<<endl; 
string line; 
while (getline(file, line)) 
{ 
    //stringstream the getline for line string in file 
    istringstream iss(line); 
    // file>>date>>amount; // that line seems a bit off... 
    if (iss >> date >> amount;) // it would have failed before when line was an empty last line. 
    { 

     cout<<date<<"\t\t"<<amount<<endl; 
     famount+=amount; 
    } 

} 
cout<<famount; 

getline(file, line) 빈 마지막 줄을 읽는다면, 그것이 사실 돌아가서 동안 블록을 입력하기 전에. 나중에 iss >> date >> amountstringstream이 빈 줄에만 설정되므로 while 블록 내에서 실패하므로 이전에 줄에서 날짜와 금액을 출력하는 작업을 반복합니다.

당신이 eof() 확인해야하는 경우가 거의 항상 뭔가 잘못된 것을 기억

...

+0

+1 이것은 행 단위 처리를 위해이 작업을 수행하는 올바른 방법이며, 마지막 행이 중복되는 방식을 분석하면 (원래 코드에서'file.eof()'호출을하지 않아도 됨) , 흥미있는 두뇌 cersise이었다. – WhozCraig

+0

"// 파일 >> 날짜 >> 금액; // 그 줄은 약간 벗어난 것처럼 보입니다 ..."- 부족. Lol yea 나는 코드를 가르치려고 노력하고 있습니다. 그래서 나는 그런 실수를합니다. 하지만 당신의 도움에 감사드립니다. 고마워요 :) – user2934783

+0

@ user2934783 그 실수는 당신이 의도 한 것의 * 반대 *를 정확히 수행하는 per-line 유효성 검사로 이어진다는 것은 솔직히 아이러니합니다. – WhozCraig

관련 문제