2012-06-15 2 views
0

제 문제는 텍스트 파일에서 char, string int를 입력하려고합니다. getline()을 사용하여 입력하는 방법을 알고 있지만, get line() 함수를 사용한 후에는 더 이상 문자열 뒤에 오는 나머지 정수를 입력 할 수있는 옵션이 없습니다. 내 질문에, 어떻게 입력 할 수 있습니다 숯불, 다음 문자열을 공백) 3 ints? 많은 도움이 필요 당신을위한텍스트 파일에서 특정 길이의 공백으로 입력 문자열을 읽는 방법 C++

int main() 
    { 
    string city; 
    double price; 
    int amt1, amt2, amt3; 
    char orderStatus; 

    ifstream warehouse; 
    ofstream output; 
    warehouse.open("data.txt"); 
    output.open("dataOut.txt"); 

    while (warehouse.good()) 
    { 
     warehouse >> orderStatus; 
     output << orderStatus << "\t"; 

     getline(warehouse, city, '\t'); 
     //warehouse >> city; 
     output << city << endl; 

     //warehouse >> amt1; 
     //output << amt1 << "\t"; 

     //warehouse >> amt2; 
     //output << amt2 << "\t"; 

     //warehouse >> amt3; 
     //output << amt3; 
    } 


    warehouse.close(); 
    output.close(); 

    return 0; 
    } 

감사 :

data.txt로는 다음이

a New York 5 7 9 
b Virginia 10 2 5 
c Los Angeles 25 15 6 

처럼 보이는 것은 내 코드입니다.

+1

줄을 가져온 후 한 줄로 토큰을 줄 수 있습니다. – Mahesh

+0

@Mahesh와 동의합니다. 그런 식으로 몇 번이나 했니? 문제는 "int"가 텍스트 파일에서 오는 ASCII 문자입니다. 이것은 실제로 int로 변환해야하는 char/string이라는 것을 의미합니다. – guitarflow

답변

1

빠른 해결책은 atoi (docs에 대한 링크)을 사용하는 것입니다. 이것은 숙제처럼 들리므로 나는 당신을 위해 그것을 해결하고 싶지 않습니다. (그것의 재미는 어디 있습니까?)하지만 당신은 문자열로 값을 가져올 수 있습니다. 원하는 경우 문자를 한 번에 하나씩 정수로 수동 변환하여 숫자를 재구성 할 수도 있지만 atoi은이 모든 것을 처리합니다. 나는 이것들이 std :: string이라고 추측하고있다. atoi는 C 문자열만을 받아들이므로 c_str()을 호출해야 할 것이다.

1

다음은 코드 편집 내용입니다. 첫 번째 탭 구분 기호를 건너 뛰려면 warehouse >> noskipws >> orderStatus >> skipws;을 추가하십시오. 또한 불완전한 데이터가있는 경우를 대비하여 매회 읽은 후에 if(!warehouse.good()) break;을 추가하십시오. 그것이 C이라면, 나는 fscanf(file, " %c %[^\t]s %d %d %d", ...)을했을 것입니다.

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string city; 
    double price; 
    int amt1, amt2, amt3; 
    char orderStatus; 

    ifstream warehouse; 
    ofstream output; 
    warehouse.open("data.txt"); 
    output.open("dataOut.txt"); 

    while (warehouse.good()) 
    { 
     warehouse >> orderStatus; 
     if(!warehouse.good()) break; 
     output << orderStatus << "\t"; 
     // to skip the tab delimiter 
     warehouse >> noskipws >> orderStatus >> skipws; 
     if(!warehouse.good()) break; 

     getline(warehouse, city, '\t'); 
     if(!warehouse.good()) break; 
     output << city << "\t"; 

     warehouse >> amt1; 
     if(!warehouse.good()) break; 
     output << amt1 << "\t"; 

     warehouse >> amt2; 
     if(!warehouse.good()) break; 
     output << amt2 << "\t"; 

     warehouse >> amt3; 
     if(!warehouse.good()) break; 
     output << amt3 << endl; 
    } 


    warehouse.close(); 
    output.close(); 

    return 0; 
} 
관련 문제