Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;从输入文件中只读入一些(而不是全部)数据以添加到记录中_C++_Fstream_Getline - Fatal编程技术网

C++ C++;从输入文件中只读入一些(而不是全部)数据以添加到记录中

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 &

我目前有一个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 << "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";