繁体   English   中英

从文件中逐行提取数据到C ++中的动态数组

[英]Extracting line by line data from file into dynamic array in C++

我试图从文件中提取数据,并将其放入类型为DataBlock的动态数组中(DataBlock是struct)。 问题在于,在for循环的第一个迭代中正确地提取了数据,但随后没有。 我已经调试过,问题是在for循环的第一次迭代并将第一次迭代的最后一个值分配给整个数组之后,指针没有移到下一行。

编辑:现在我意识到问题是由于文件中的“ ****”,因为它们不是整数。 但是它们是必需的(它们有助于计算记录大小)是否可以跳过带有“ ****”的行。

这是文件中的数据:

3
4
2029
23
45
459
***
1
2
2015
3
4
20
***

当数据移动到数组并显示时,它显示:

3
4
2029
23
45
459
***
459
459
459
459
459
459
***

这是代码:

DataBlock *writetoarray(string uname)
{
    int size;
    int data;

    size = SizeOfArray(uname);
    cout << "size:" << size << endl;
    DataBlock *ptr = new DataBlock[size];

    ifstream displayf;
    displayf.open(uname.c_str());
    int i = 0;

    for (int i = 0; i < size; i++)
    {
        displayf >> data;
        //istream& getline(displayf >> data);
        ptr[i].date = data;
        cout << ptr[i].date << endl;

        displayf >> data;
        ptr[i].month = data;
        cout << ptr[i].month << endl;

        displayf >> data;
        ptr[i].year = data;
        cout << ptr[i].year << endl;

        displayf >> data;
        ptr[i].hrs = data;
        cout << ptr[i].hrs << endl;

        displayf >> data;
        ptr[i].min = data;
        cout << ptr[i].min << endl;

        displayf >> data;
        ptr[i].bgl = data;
        cout << ptr[i].bgl << endl;

        displayf >> data;
        cout << "***" << endl;

    }
    displayf.close();
    return ptr;
}//function ends

我已经搜索了很多,但是找不到解决方案。 明天是提交日期。 如果您能帮助我,我将非常感谢。 请告诉我是否需要任何进一步的信息。

添加更多详细信息:这是DataBlock代码:

struct DataBlock
{
    int date, month, year, hrs, min, bgl;
};

对于文件迭代,最好使用getline函数。 请尝试以下操作,看它是否对您有帮助:

 std::string fileLine;

 while(!displayf.eof()) //Will navegate in the file until it reachs the end.
 {
      getline(displayf, fileLine);

      //Now your file data is in fileLine variable

     /*Do what your need with the data here*/

 }

对于while循环的每个交互,fileLine将有一行文件,当文件到达末尾时,循环将自动结束。

该问题已通过以下方式解决:

出现问题的是星号,因为它们不是int,但提取行的变量是int类型

在提取星星后就解决了这个问题:

displayf >> data;
        if (displayf.failbit)
        {
            cout << "***" << endl;
            displayf.clear();
            displayf.ignore(numeric_limits<streamsize>::max(), '\n');
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM