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

时间:2015-03-28 19:56:35

标签: c++ file ifstream

如何从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;

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

1 个答案:

答案 0 :(得分:0)

如评论中提到的@πάνταῥεῖ,您需要实现一个可以解释文件中<>标记的解析器。另外,我建议重新考虑数据类型。

具体而言,鉴于您使用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的{​​{1}}类,并根据需要读取数据。