【问题标题】:Extracting line by line data from file into dynamic array in C++将文件中的逐行数据提取到C++中的动态数组中
【发布时间】:2015-01-12 11:20:28
【问题描述】:

我正在尝试从文件中提取数据并将其放入 DataBlock 类型的动态数组中(DataBlock 是结构)。问题是在 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

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

添加更多细节: 这是数据块代码:

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

【问题讨论】:

  • 你为什么不使用getline(displayf, some_string, '\n'),然后以你想要的方式处理some_string
  • 你能展示一下DataBlock结构吗
  • 根据观察,星号不是数字,因此不能放入整数。我没有看到任何处理星号的代码;我建议使用 getline(..) 将每一行放入一个字符串中,如果字符串中的字符是星号,则应继续。
  • 感谢您的回复。你能解释一下如何使用getline吗?需要进行哪些更改。我根本不擅长文件处理。

标签: c++ arrays for-loop struct file-handling


【解决方案1】:

对于文件迭代,最好使用 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都会有一行文件,当文件到达末尾时循环将自动结束。

【讨论】:

  • 感谢您的回答。我试过这个。现在的问题是文件中的所有数据都是整数,而结构的所有数据成员也是整数。如果您能提出解决方案,我将不胜感激。
  • 嘿!你好!我在堆栈溢出中发现了这个关于你的问题,希望它可以帮助你。 Read Numeric Data from a Text File in C++
  • Don't tell people to loop on eof(), it's a bad practice. 改用while (getline(displayf, fileLine)) {}
  • 唯一的问题是文件中的星号,因为它们不是整数。有没有办法跳过它们。请参阅原始问题中的编辑。谢谢
  • 好吧,不知道这是否是一个好的方法...但是您可以先将其作为字符串读取,然后与“***”进行比较。然后读取为 int。
【解决方案2】:

问题就这样解决了:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-07-24
    • 2014-04-22
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多