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 >>
并根据需要读入数据。
例如,如何为 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 >>
并根据需要读入数据。