2017-01-23 69 views
0

我的程序需要從包含不超過50個球員統計的文本文件中讀取。輸入的一個例子是:Getline和解析數據

Chipper Jones 3B 0.303 
Rafael Furcal SS 0.281 
Hank Aaron RF 0.305 

我的問題是,我似乎無法弄清楚如何在每一行內分析數據。我需要幫助搞清楚如何我要做到這一點,從而使輸出如下:

Jones, Chipper: 3B (0.303) 
Furcal, Rafael: SS (0.281) 
Aaron, Hank: RF (0.305) 

我的目標是建立某種形式的循環,將通過任何可用的線路運行,解析線,並將每行的內容建立到與它們相關的變量。

代碼:

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

using namespace std; 

class player 
{ 
private: 
    string first, last, position; 
    float batave; 
    int a; 

public: 
    void read(string input[50]); 
    void print_data(void); 

} playerinfo; 

void player::print_data(void) 
{ 
    cout << last << ", " << first << ": " << position << " (" << batave << ")" << endl; 
} 

void player::read(string input[]) // TAKE INFORMATION IN THE FILE AND STORE IN THE CLASS 
{ 
    for (int a = 0; a <= 50; a++); 
    { 
     // getline(input[0], first, ' ', last,); 
    } 

} 



int main(void) 
{ 
    ifstream infile; 
    string filename; 
    ofstream outfile; 
    string FILE[50]; 

    cin >> filename; 

    infile.open(filename.c_str()); 

    if (!infile) 
    { 
     cout << "We're sorry! The file specified is unavailable!" << endl; 
     return 0; 
    } 
    else 
    { 
     cout << "The file has been opened!" << endl; 

     for (int a = 0; getline(infile, FILE[a]); a++); 
     playerinfo.read(FILE); 
     playerinfo.print_data(); 

    } 
    printf("\n\n\n"); 
    system("pause"); 
} 

我不得不 提示用戶輸入和輸出文件名。不要將文件名硬編碼到您的程序中。 打開輸入文件 讀取每個播放器並將它們存儲在播放器對象數組中 跟蹤播放器數量 打開輸出文件 將每個播放器從數組寫入輸出文件,以及任務所需的任何其他輸出。 請記住在完成後關閉文件

+0

你知道'stringstream'? – Barmar

+0

不需要。這只是一個基本的C++程序,用於讀取文件,然後解析並將其發送回outfile。 –

回答

0

您有50個字符串用於輸入中的行,但只有一個playerinfo。它需要反過來 - 用於讀取文件的單個字符串,以及將數據解析到其中。

+0

我還是有點困惑。我有主循環在它剛剛讀取文件的每一行,然後發送文件到函數,然後我可以解析它。有沒有辦法在函數內解析,這是你的意思? for(int a = 0; getline(infile,FILE [a]); a ++); \t \t playerinfo [50] .read(FILE); –

0

使用流提取和插入運算符重載。例如,請參閱下面的代碼並根據您的需求進行修改。

#include <iostream> 
using namespace std; 

class player { 
private: 
    string first, last, position; 
    float batave; 
    int a; 

public: 
    friend std::istream & operator>>(std::istream & in, player & p) { 
     in >> p.first >> p.last >> p.position >> p.batave; 
     return in; 
    } 

    friend std::ostream & operator<<(std::ostream & out, const player & p) { 
     out << p.last << ", " << p.first << ": " << p.position << " (" << p.batave << ")"; 
     return out; 
    } 
}; 

int main() { 
    player p; 
    while (cin >> p)   // or infile >> p; 
     cout << p << endl; // or outfile << p << endl; 
} 

看到一個DEMO