2016-02-25 84 views
0

我使用以下代碼從文件中讀取數據,但是我的問題是我只想從文件中的多個列中捕獲一些列。有沒有比我使用的方法更好的方法。使用fstream讀取選定的列

void Data::read_simulated (const string &filepath) 
{ 
    ifstream data_out (filepath.c_str()); 

    if (!data_out) 
     cout<<"Failed to open"<<endl; 
    else 
    { 
     string id_p,age_p, dim_p, my_p, mcf_p, mcp_p, mcl_p, bw_p, bcs_p; 
     string dummy_line, g; 
     getline(data_out, dummy_line); 

     while(data_out>>age_p>>g>>g>>g>>g>>g>>g>>g>>bcs_p>>g>>g>>my_p>>g>>g>>bw_p>>g>>g>>dim_p>>g>>g>>g>>g>>g>>g>>g>>g>>g>>g>>g>>g>>g) 
     { 
      //s.cow_id.push_back(get_number(id_p)); 
      if (get_number(age_p)>=1424.0 &&get_number(age_p)<=1733.0) 
      { 
       age_pre.push_back(age_p); 
       dim_pre.push_back(dim_p); 
       my_pre.push_back(my_p); 
       //mcf_obs.push_back(get_number(mcf_p)); 
       // mcp_obs.push_back(get_number(mcp_p)); 
       //mcl_obs.push_back(get_number(mcl_p)); 
       bw_pre.push_back(bw_p); 
       bcs_pre.push_back(bcs_p); 
      } 
     } 

     data_out.close(); 
    } 
} 

回答

0

如果列用空格排列,每種原料在列數和恆定的線是多個位置,你可以使用std::istream::ignorestd::istream::seekg功能跳過一些行。

如果不是的話,至少讓你的代碼更漂亮使用此功能:

std::istream &skip_row(std::istream &is, unsigned int count) 
{ 
    std::string s; 

    while(count-- && is >> s) {} 

    return is; 
} 

你可以使它成爲一個模板接受不同類型的,或者你可以重載一個operator>>一類來獲得不同的語法比這

data_out >> age_p && skip_row(data_out, 5) && data_out >> bcs_p >> ... 

天真的方法是讀取所有的行成std::vector<std::string>,然後指數,但它會對性能產生影響,由於過多的內存分配。

+0

當我們將此函數添加到當前類「數據」。我們是否必須將Data ::聲明爲其他常規函數,以及Data.h中的函數原型如何。我試圖使用你建議的函數skip_row,但它不起作用。錯誤:未定義對'Data :: skip_row(std :: istream&,unsigned int)'|的引用 – hieu

+0

@hieu它不必在頭文件中聲明,並且您的聲明與定義不匹配 - 在返回類型中缺少'&'。刪除你的「答案」,如果這工作,請,這應該是你的問題的編輯。 – LogicStuff