2011-09-08 22 views
1

我只想讀取文本文件並將數據存儲到向量中。因此,價值權重應該總和,直到達到極限。前四行將被正確讀取,但以下內容不會被讀取。什麼是錯誤?在C++中錯誤地讀取文本文件

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 
#include <limits> 

/* 
Data.txt 

John 
6543 
23 

Max 
342 
2 

A Team 
5645 
23 
*/ 

struct entry 
{ 
    // passengers data 
    std::string name; 
    int weight; // kg 
    std::string group_code; 
}; 

void reservations() 
{ 
    std::ofstream file; 
    file.clear(); 
    file.open("reservations.txt"); 
    file.close(); 
} 

entry read_passenger(std::ifstream &stream_in) 
{ 
    entry passenger; 
    if (stream_in) 
    { 
     std::getline(stream_in, passenger.name); 
     stream_in >> passenger.weight; 
     std::getline(stream_in, passenger.group_code); 
     stream_in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     return passenger; 
    } 

    return passenger; 
} 

int main(void) 
{ 
    std::ifstream stream_in("data.txt"); 
    std::vector<entry> v; // contains the passengers data 
    const int limit_total_weight = 10000; // kg 
    int total_weight = 0;     // kg 
    entry current; 
    while (!stream_in.eof()) 
    { 
     current = read_passenger(stream_in); 
     total_weight = total_weight + current.weight; 
     std::cout << current.name << std::endl; 
     if (total_weight >= limit_total_weight) 
     { 
      break; 
     } 

    } 
     return 0; 
} 

回答

1

這兩條線,

std::getline(stream_in, passenger.group_code); 
    stream_in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

應以相反的順序:

stream_in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    std::getline(stream_in, passenger.group_code); 

想想什麼目的ignore是。

另外,不是隻檢查EOF,而是檢查一般錯誤。

即,而不是

while (!stream_in.eof()) 

while (stream_in) 

也許有更多的錯誤,但是上面的是我立刻看到。

乾杯&心連心,

+0

你說的是幾乎是正確的,但你需要放置也忽略了「passenger.groupcode」之後跳過換行分隔條目。 –

+0

哦,有空白的行。那麼,忽視就是對付它們的一種方法。 –

+0

克萊門特貝洛:所以它的工作!謝謝 – burner007

1

我儘量不要混用格式化和正是這個原因,面向行的輸入。如果是我,我只好用getline任何地方,我會用getline無處不在:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 
#include <limits> 
#include <sstream> 

struct entry 
{ 
    // passengers data 
    std::string name; 
    int weight; // kg 
    std::string group_code; 
}; 

void reservations() 
{ 
    std::ofstream file; 
    file.clear(); 
    file.open("reservations.txt"); 
    file.close(); 
} 

std::istream& operator>>(std::istream& stream_in, entry& passenger) 
{ 
    std::getline(stream_in, passenger.name); 

    std::string weightString; 
    std::getline(stream_in, weightString); 
    std::istringstream (weightString) >> passenger.weight; 

    std::getline(stream_in, passenger.group_code); 

    return stream_in; 
} 

void read_blankline(std::istream& stream_in) { 
    std::string blank; 
    std::getline(stream_in, blank); 
} 

int main(void) 
{ 
    std::ifstream stream_in("data.txt"); 
    std::vector<entry> v; // contains the passengers data 
    const int limit_total_weight = 10000; // kg 
    int total_weight = 0;     // kg 
    entry current; 
    while (stream_in >> current) 
    { 
     total_weight = total_weight + current.weight; 
     std::cout << current.name << std::endl; 
     if (total_weight >= limit_total_weight) 
     { 
      break; 
     } 
     read_blankline(stream_in); 
    } 
    return 0; 
}