具有挑战性的数据文件格式,需要读入包含类对象的数组的变量

时间:2017-12-07 04:18:00

标签: c++ fstream ifstream getline

我有一个包含Garbage类的5个实例的程序,垃圾有3个我需要从数据文件更新的变量。第一个是char数组,另外两个是整数。除了更新int变量之外的所有工作,我都不知道如何实现这一点,所以任何帮助都非常感谢。我的代码:

#include <iostream>
#include <cctype>
#include <cstring>
#include <fstream>
#include <iomanip>

using namespace std;

class Garbage {
  public:
    void writeData();
    void updateFromFile( ifstream & file );
  private:
    char name[40];
    int num1;
    int num2;
};

void Garbage::writeData() { 
  cout << name << ", " << num1 << ", " << num2 << endl;
}

void Garbage::updateFromFile ( ifstream & file ) {

  if ( !file.eof() ) {

    file.getline(name, STRLEN);

    /*
    Int variables from Garbage class need to be updated here
    */

  }

}

void readFile() {

  ifstream infile("data.txt");

  for(int i = 0; i < sizeof(garbages)/sizeof(garbages[0]); i++) {
    garbages[i].updateFromFile(infile);
  }

}

Garbage garbages[5];

int main() {
  readFile();

  for(int i = 0; i < sizeof(garbages)/sizeof(garbages[0]; i++) {
    garbages[i].writeData();
  }

  return 0;
}

&#34; data.txt&#34;的数据结构如下:

lorem A
10 20
ipsum B
20 30
dolor C
30 40
sit D
40 50
amet E
50 60

lorem是char数组(可能包含空格!),10是num1,20是num2,依此类推。由于这是一个学校作业,我不能改变c ++代码的结构,也不能改变数据文件结构。如果没有额外的预处理指令就可以实现这一目标,那将是更可取的。

非常感谢任何和所有输入!

编辑:修复了类成员函数命名不一致和使用sizeof()的情况。我还在数据结构的名称字段中添加了一个可选字母,表明该名称可能包含空格,因此我不能依赖&#34;&gt;&gt;&#34;运营商,必须使用getline。

1 个答案:

答案 0 :(得分:1)

流运营商消耗空白。你所需要的只是

void Letter::updateFromFile ( ifstream & file ) {
  file.getline(name, STRLEN);
  file >> num1 >> num2 >> ws; // eat the end of line
}

其他: 如果您可以控制参数,我会将其更改为istream &,因为没有任何特定于文件流的参与。努力使用正常工作的最不具体的类型。

C样式数组比std::arraystd::vector更奇怪,更难安全使用,功能更少。今天使用它们的唯一原因是与C代码共享定义。