我使用过 C# 和 Java,所以我习惯于打开一个输入文件并读取文件流的末尾,同时在每一行上使用某种 .split
分隔符作为制表符、逗号等以获取单个值或为每个值提取特定数量的字符。我最近开始上 C++ 类(class),到目前为止作业没有任何问题,因为它们主要使用控制台输入/输出,但我发现从文件中提取数据相当困难:
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 分隔符更改为\t 并以此方式设置每个值(即,在设置 3 个属性后将 i 重置为 0),但如果其中一行缺少值,这将不起作用。这在这个小任务中无关紧要,但我希望正确有效地完成这项工作。提取每行数据并将其正确解析为适当数据类型的最有效方法是什么?
注意:此时我不应该使用 vector 或算法。
最佳答案
我会建议 stringstream .您已经在使用标准流,所以我认为这不会偏离主题(如果是,看起来您应该编写自己的字符串拆分器)。 stringstream
的工作方式与 ifstream
完全相同,但它从内存缓冲区而不是文件中读取:
#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'
}
}
您也可以split by commas和任意定界符 getline
关于C++将输入文件行解析为对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37231666/