2009-12-18 14 views
0

내가 읽었던 파일이 있는데, 각각 다른 수의 정수를 가진 줄이 포함되어 있는데,이 줄을 정수 벡터의 벡터로 분할하는 데 문제가 있습니다.int로 줄 바꿈

이것은 현재 코드입니다.

std::vector<int> read_line() 
{ 
    std::vector<int> ints; 
    int extract_int; 
    while((const char*)std::cin.peek() != "\n" && std::cin.peek() != -1) 
    { 
     std::cin >> extract_int; 
     ints.push_back(extract_int); 
    } 
    return ints; 
} 
std::vector<std::vector<int> > read_lines() 
{ 
    freopen("D:\\test.txt", "r", stdin); 
    freopen("D:\\test2.txt", "w", stdout); 
    std::vector<std::vector<int> > lines; 
    while(!std::cin.eof()) 
    { 
     lines.push_back(read_line()); 
    } 
    return lines; 
} 

문제는 모든 int가 단일 행으로 읽히는 것입니다.

내가 뭘 잘못하고 있니?

답변

2

문제는 (const char *)std::cin.peek() != "\n"입니다. casts are evil; 그들을 사용하지 않도록하십시오. 다음 코드는 작동 :

std::vector<int> read_line() 
{ 
    std::vector<int> ints; 
    int extract_int; 
    while(std::cin.peek() != '\n' && std::cin.peek() != -1) 
    { 
     std::cin >> extract_int; 
     ints.push_back(extract_int); 
    } 

    std::cin.ignore(); // You need this to discard the \n 

    return ints; 
} 
+0

감사합니다. –

+2

이 경우에는 const char *와 ==를 비교하려는 시도만큼 악조건이 아닙니다. –

+0

근본 원인을 정확하게 식별하려면 +1에서 단으로. 원래 코드는 실제로 두 문자열에 대한 * 포인터 *가 같은지 여부를 확인합니다. 어느 포인터가 맞지 않을지 기대합니다. – ceo

7

getline()을 사용하여 한 줄을 읽은 다음 전체 파일을 단일 스트림으로 처리하지 말고 해당 줄에서 string stream을 읽을 수 있습니다.

+0

이 기능의 이점은 무엇입니까? –

+0

코드가 훨씬 명확합니다. – Amber

0

그런 다음

template<class T> 
struct print : public std::unary_function<T,void> 
{ 
    print(std::ostream &out) : os(out) {} 
    void operator() (T x) { os << '[' << x << ']'; } 
    std::ostream &os; 
}; 

void print_vector(const std::vector<int> &v) 
{ 
    std::for_each(v.begin(), v.end(), print<int>(std::cout)); 
    std::cout << '\n'; 
} 

int main() 
{ 
    std::vector< std::vector<int> > lines = read_lines(); 

    std::for_each(lines.begin(), lines.end(), print_vector); 

    return 0; 
} 
과 결과를 인쇄

std::vector< std::vector<int> > read_lines() 
{ 
    std::vector< std::vector<int> > lines; 

    while (std::cin) { 
    std::vector<int> line = read_line(); 

    if (std::cin) 
     lines.push_back(line); 
    } 

    return lines; 
} 

으로 다음

std::vector<int> read_line() 
{ 
    std::vector<int> ints; 

    std::string line; 
    std::getline(std::cin, line); 

    int i; 
    std::stringstream ss(line); 
    while (ss >> i) 
    ints.push_back(i); 

    return ints; 
} 

와 함께 벡터에 모든 벡터를 한 줄 읽기

예 :

 
$ cat input 
1 2 3 4 
5 6 
7 8 9 
10 

$ ./try.exe <input 
[1][2][3][4] 
[5][6] 
[7][8][9] 
[10]