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

标签 c++ parsing io text-files

我使用过 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/

相关文章:

c - 处理不完整的 write() 调用

javascript - 在 c++ 和 node.js(服务器)之间建立套接字通信的困难

c++ - Visual Studio 远程调试 Makefile 项目的远程输出路径错误

python - ElementTree 查找返回 'None' ?

io - 高效地将大文件(高达 2GB)传输到 CUDA GPU?

c++ - 如何在C++中从头到尾写入文件

c++ - 埃拉托斯特尼筛法的问题

c++ - "extern __forceinline "是什么 C++ 习语?

java - 从 JSON 中提取

c# - 如何从文本文件中提取文件路径