2015-01-22 3 views
2

안녕하세요. 나는 2 가지 문제가있다. 파일에서 읽는 동안 C++ 데이터가 누락 됨

  1. 내 파일
  2. 의 마지막 데이터를 인쇄하는 데 문제가

    어떻게 특정 행이 이름으로 시작 인쇄 할 수 있습니다

데이터 :

tom12:Miscellaneous:-30.52:20JAN15 
ben23:Utility Bill:-56.50:17JAN15 
tom12:Child Needs:-80.95:15JAN15 
tom12:Baby needs:-20.9:18JAN15 
ben23:Phone Bill:-35.90:12JAN14 
ben23:Housing Bill:-192.88:01JAN15 

코드 :

string line; 
ifstream file("expenses.txt"); 
double totalNegative = 0; 
double totalPositive = 0; 
while(getline(file, line)) 
{ 
    stringstream linestream(line); 
    string data1; 
    string data2; 
    double data3; 
    string data4; 
    getline(linestream, data1, ':'); 
    getline(linestream, data2, ':');    
    linestream >>data3; 
    getline(linestream, data4, ':'); 
    cout << data2 << " $" << data3 << " " << data4 << " "<< endl; 
} 

결과 :

Miscellaneous $-30.52 
Utility Bill $-56.50 
Child Needs $-80.95 
Baby needs $-20.9 
Phone Bill $-35.90 
Housing Bill $-192.88 

결과에 마지막 열의 날짜가 누락되었습니다. 그리고 어떻게하면 사용자 인 "tom12"만 출력 할 수 있습니까? 감사!

답변

2
1 개 문자를 무시합니다

{ 
    stringstream linestream(line); 
    string data1; 
    string data2; 
    double data3; 
    string data4; 
    getline(linestream, data1, ':'); 
    getline(linestream, data2, ':');    
    linestream >>data3; 
    linestream.ignore(1); // ignore ':' 
    getline(linestream, data4, ':'); 
    cout << data1 << " $" << data3 << " " << data4 << " "<< endl; 
} 

Live code here

  • linestream.ignore(1);를 추가로 코드를 변경

    . 당신이 : 때까지 날짜를 읽으려고 그렇지 않으면 때 첫 번째 문자 데이터 1에 :

  • 변경 데이터 2는
  • 이 조건부로 인쇄 할 경우를 사용하려면 이름을 얻을 수 있습니다, 당신은 아무것도를 읽고 없습니다 결국 cout을 문 앞에

if(data1 == "tom12") cout << data1 << " $" << data3 << " " << data4 << " "<< endl;

+0

이러한 변경이 관련된 이유에 대한 설명이 유용 할 것입니다. – Borgleader

+0

@ 보글 리더 감사합니다. 추가 된 세부 정보. 나는 우연히 어떤 열쇠 (아마도 ctrl + enter)를 치고 나의 대답은 완료 전에 제출되었다. –

+0

고마워. 매일 뭔가를 배웠다. :) –

1

linestream >>data3; 

후 여전히 콜론이 플러스 스트림 내의 마지막 토큰 당신과 -30.52을 포함한 모든 것을 소비하기 때문에 예를 들어, 스트림에 남아있는 것을 첫 번째 줄

tom12:Miscellaneous:-30.52:20JAN15 

의 경우

:20JAN15 

입니다. 이 상태에서

getline(linestream, data4, ':'); 

은 공백 문자열 인 다음 : 전에 모든 것을 제공합니다.

변형 된 데이터를 처리하는 방법에 따라 여러 가지 방법으로 문제를 해결할 수 있습니다. 아마도 가장 쉬운 것은

getline(linestream, data4, ':'); // consume that colon (and possibly things left before it) 
getline(linestream, data4);  // then take the rest of the line. 
관련 문제