C++ C++;从输入文件中只读入一些(而不是全部)数据以添加到记录中
我目前有一个CSV文件,其中包含以下数据: 名字…头发…蛋…高…水…土地…家庭 应用………1………0………1………0………0………1 水坝…1…1…0…0…1…1…1 万古……0…………1…………0…………1…………1…………0 其中0为假,1为真。我只对物体的名字感兴趣,高的,国内的,我会把它添加到记录中。到目前为止我有C++ C++;从输入文件中只读入一些(而不是全部)数据以添加到记录中,c++,fstream,getline,C++,Fstream,Getline,我目前有一个CSV文件,其中包含以下数据: 名字…头发…蛋…高…水…土地…家庭 应用………1………0………1………0………0………1 水坝…1…1…0…0…1…1…1 万古……0…………1…………0…………1…………1…………0 其中0为假,1为真。我只对物体的名字感兴趣,高的,国内的,我会把它添加到记录中。到目前为止我有 ifstream inFile("file_name.csv"); if (inFile.fail()) { std::cout &
ifstream inFile("file_name.csv");
if (inFile.fail())
{
std::cout << "File cannot be opened due to an error." << endl;
exit(1);
}
string junk;
getline(inFile,junk);
ifstream infle(“file_name.csv”);
if(infle.fail())
{
std::cout name>>头发>>鸡蛋>>高>>水>>陆地>>国内)我在想while循环中的for循环,但我就是想不出来。任何帮助/指导都将不胜感激
在这些情况下,我建议您使用类或结构对每一行建模:
struct Record
{
std::string name;
int hair;
int eggs;
int tall;
int water;
int land;
int domestic;
friend std::istream& operator>>(std::istream& input, Record& r);
};
std::istream& operator>>(std::istream& input, Record& r)
{
input >> name;
input >> hair;
/...
input >> domestic;
return input;
}
通过重载运算符>>
可以简化输入:
std::vector<Record> database;
Record r;
while (data_file >> r)
{
database.push_back(r);
}
顺便说一句,现代计算机的速度足够快,从文件中读取所有数据比尝试跳过数据要快。读取记录并只使用您想要使用的字段。一个问题是,文件读取有一个启动开销。例如,每次执行事务时,硬盘驱动器都必须启动,目录表需要搜索获得文件名、扇区和磁道后,就可以开始读取数据了。因此,如果您中断(如跳过),您将不得不执行此开销(除非沿途记住磁道、扇区和文件位置)。这样数据流动就容易多了。所以您说的是,“空间必须流动吗?”我所说的是为了获得最佳效率,保持流的流动。每个事务读取尽可能多的数据。多个顺序读取比重新定位然后读取更有效。尝试启动和停止流将花费更多的精力,而不是让流流动。例如,分配一个大缓冲区,如1MB,并将二进制读取到缓冲区中。阅读后,从缓冲区构造对象。必要时重复。嗨,托马斯,谢谢你的快速响应!不幸的是,我不允许使用类或结构来实现这一点。这是派生类中的公共对象的实现,该派生类继承自基类。我被要求只做一个简单的实现at将允许将这些特定项添加到记录中。我不明白。您不允许使用类或结构,但这是派生类的实现。如果您不能使用类或结构,则使用并行数组。记住这个概念是读取一个或多个记录,然后提取您需要。谢谢Thomas!我最后使用了getline(流、变量、分隔符),其中分隔符是逗号(\n表示最后一项)。结果TSV文件的工作方式与CSV文件非常不同,lol。再次感谢您的帮助。@McRunning:如果这个答案有帮助,请单击复选标记。
std::cout << database[3].name << "\n";