C ++将输入文件行解析为对象数组

C++ parsing an input file line into an array of objects

我已经使用了C语言和Java语言,所以我习惯于打开一个输入文件,直到文件流的结尾,而在每一行上使用一些EDCOX1的0度,用定界符作为制表符、逗号等,以获得单个值或提取每个值的特定字符数。我最近开始使用C++类,到目前为止还没有任何问题,因为它们大多使用控制台输入/输出,但是我发现从文件中提取数据相当困难:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
struct Student{
    string _fullName[50];
    int _grade;
    float _avg;
};

int main(){

    Student students[30];

    ifstream inputFile;
    inputFile.open("file.txt");
    if (inputFile.is_open()){
        int i = 0;

        char data[100];
        while (inputFile.getline(data, 100)){
           //need to split the data by \t and properly convert it into an int/string/float where needed
        }

    }
    system("pause");
    return 0;
}

我考虑将getline分隔符更改为 并以这种方式设置每个值(即,在设置了3个属性后将i重置为0),但如果其中一行缺少值,这将不起作用。在这项小任务中,这并不重要,但我希望能够正确有效地完成这项任务。提取每行数据并将其正确解析为适当的数据类型的最有效方法是什么?

注意:在这一点上我不应该使用向量或算法。


我建议使用Stringstream。您已经在使用标准流,所以我不认为这会偏离主题(如果是,看起来您应该编写自己的字符串拆分器)。stringstream的工作原理与ifstream完全相同,但它从内存缓冲区而不是文件读取:

1
2
3
4
5
6
7
8
9
10
#include <sstream>
// ...

char data[100];
while (inputFile.getline(data, 100)){
   std::stringstream lineStream(data);
   while (lineStream >> data) {
     // now you have a token (space-delimeted) in 'data'
   }
}

您还可以使用getline按逗号和任意分隔符进行拆分。