代码之家  ›  专栏  ›  技术社区  ›  Audun Olsen

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

  •  0
  • Audun Olsen  · 技术社区  · 7 年前

    我有一个程序,有5个垃圾类实例,垃圾有3个变量,我需要从数据文件中更新。第一个是字符数组,另两个是整数。除了更新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;
    }
    

    “data.txt”的数据结构如下:

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

    lorem是字符数组(可能包括空格!),10是num1,20是num2,依此类推。由于这是一项学校作业,我无法更改c++代码的结构或数据文件结构。如果不需要额外的预处理指令就可以实现这一点,那将是更好的选择。

    非常感谢您的任何意见!

    编辑: 修复了类成员函数命名不一致和sizeof()使用不当的问题。我还在数据结构的名称字段中添加了一个可选字母,表明名称可能包含空格,因此我不能依赖“>”操作员,必须使用getline。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Caleth    7 年前

    流运算符使用空格。你所需要的就是

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

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

    C风格的数组更古怪,更难安全使用,功能也不如 std::array std::vector . 这个 只有 今天使用它们的原因是与C代码共享定义。