C ++如何从文件中读取我想要的内容?

C++ how to read what I want from a file?

例如,如何为 C++ 代码中的变量分配结构化 .txt 文件中的值? 如果我有以下 input.txt 结构如下:

    <Name> "John Washington"
    <Age> "24"
    <ID> "19702408447417"
    <Alive Status> "Deceased"

在我的 C++ 代码中,如果我有

ifstream read("input.txt",ios::in);
char name[64];
read>>name;//name will point to John Washington string
int age;
read>>age;// cout<<age will return 24;
int ID;
read>>ID;// cout<<ID will return 19702408447417
char Alivestatus[32];
read>>Alivestatus;//Alivestatus will point to Deceased string;

如何让它像上面那样工作?

正如@πìντα ῥεῖ 在评论中提到的那样,您需要实现一个解析器来解释文件中的 <> 标签。此外,我建议重新考虑数据类型。

具体来说,如果您没有特殊原因使用 char [],请切换到 std::string。我不知道你的代码的用例,但如果 input.txt 恰好包含大于数组大小的数据,或者如果输入是用户控制的更糟,这很容易导致 Buffer溢出和不需要的攻击。 std::string 还具有标准化、优化、比 char 数组友好得多的优点,并且有各种有用的算法和函数随时可用。

关于文本文件解析,你或许可以实现如下:

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

    int main()
    {
        std::ifstream input_file("input.txt");

        std::string name_delimeter("<Name> ");
        std::string age_delimeter("<Age> ");
        std::string id_delimeter("<ID> ");
        std::string alive_delimeter("<Alive Status> ");


        std::string line;

        std::getline(input_file,line);

        std::string name(line,line.find(name_delimeter) + name_delimeter.size()); // string for the reasons described above

        std::getline(input_file,line);

        int age = std::atoi(line.substr(line.find(age_delimeter) + age_delimeter.size()).c_str());

        std::getline(input_file,line);

        std::string id(line,line.find(id_delimeter) + id_delimeter.size()); // the example ID overflows 32-bit integer
                                                                            // maybe representing is a string is more appropriate

        std::getline(input_file,line);

        std::string alive_status(line,line.find(alive_delimeter) + alive_delimeter.size()); // string for the same reason as name


        std::cout << "Name = " << name << std::endl << "Age = " << age << std::endl << "ID = " << id << std::endl << "Alive? " << alive_status << std::endl;
    }

代码的基础只是读取结构化文件并从中构造适当的数据类型。事实上,因为我对大多数数据类型使用 std::string,所以很容易通过 std::string 的构造函数和可用函数构建正确的输出。

也许您正在循环执行此操作,或者该文件有多个结构。要解决这个问题,您可以制作一个 Record class 重载 operator >> 并根据需要读入数据。