Getline和解析数据

时间:2017-01-23 08:14:54

标签: c++ file parsing getline

我的程序需要从包含不超过50个玩家统计数据的文本文件中读取。输入的一个例子是:

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");
}

我必须 提示用户输入和输出文件名。请勿将文件名硬编码到程序中。 打开输入文件 读取每个播放器并将它们存储在Player对象数组中 跟踪阵列中的玩家数量 打开输出文件 将数组中的每个播放器写入输出文件,以及分配所需的任何其他输出。 完成后,请记得关闭文件

2 个答案:

答案 0 :(得分:0)

输入中的行有50个字符串,但只有一个playerinfo。它需要反过来 - 一个用于读取文件的字符串,以及用于解析数据的50个playerinfo

答案 1 :(得分: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