将文本文件读入类对象类型数组(C ++)

时间:2009-04-01 08:35:29

标签: c++ class

所以我有一个类对象类型,myClass classType作为全局。 没有发生的事情是更愿意拥有

// MyClass.h
{
  private:
    char FirstName;
    char LastName;
    char MiddleName;
    int ID;
    int Age;
};

// Globals
const int myIndex = 256;
myClass classType[ myIndex ];

int main()
{

   // assume preprocessors are included

   cout << "Enter File: ";
   cin  >> cArray;
   if ( !inFile.good() ) 
   {
     cout << "Wrong?" << endl;
   }
   inFile.open( cArray );
   while ( !inFile.eof() )
   {
     linecount++ // giving me 1 and not counting the file lines

 inFile.read( ( char * ) &myType[linecount], sizeof( myClass ) );

   }
}

这是一个粗略的想法,今天的主要外观。 我还没有使用myClass.cpp! 我的文本文件格式为:

姓 姓 身份证号码 年龄 ...

调试之后,我注意到在同一个索引上没有检测到换行符,现在所有内容都被BUNCHED了!就像我的增量没有工作或其他东西..

我想增加它们在文件中的许多行。 ( 超过一个 ) 我试图修复linecount(idx),希望能完全解决这个问题。

调试和拖动myclasstype时,我上面写的My Private成员,FirstName LastName等等存在。 我只需要用适当的变量来获取它们。 我只是希望ifstream :: read()函数不会让我走向糟糕的方向。

任何建议?

4 个答案:

答案 0 :(得分:1)

// MyClass.h
{
  private:
    char FirstName;
    char LastName;
    char MiddleName;
    int ID;
    int Age;
};

这个结构/类是什么?我想这是myClass。无论如何,myClass并不是有意义的名字。

  1. FirstName / LastName / MiddleName eighter是首字母缩写 - 这意味着名称错误 - 或输入错误。您正在寻找的是eighter std :: string或char *。
  2. 传统上,ID是第一个字段 - 如果需要的话。
  3. ``

    // Globals
    const int myIndex = 256;
    myClass classType[ myIndex ];
    

    根据经验 - 从不使用全局变量。你有问题。

    int main()
    {
    
       // assume preprocessors are included
    
       cout << "Enter File: ";
       cin  >> cArray;
    

    什么是cArray?

       if ( !inFile.good() ) 
    

    inFile定义在哪里?为什么在此流上的任何IO操作之前检查IO状态?

       {
         cout << "Wrong?" << endl;
       }
       inFile.open( cArray );
    

    好。写ifstream inFile(cArray)不是更简单吗?

    while(!inFile.eof())    {      linecount ++ //给我1而不计算文件行

    你要求溢出。如果文件有256行以上怎么办?什么最糟糕的程序不会崩溃 - 它可能写在一些不明确的地方。

     inFile.read( ( char * ) &myType[linecount], sizeof( myClass ) );
    
    1. 除非必须,否则不要使用二进制格式。它们很难调试。如果你有一个漂亮,简单的文本格式,你需要测试的是一个文本编辑器来编辑测试输入文件。使用二进制文件,您无法保证错误是在程序中,而不是在测试用例中。
    2. 如果 使用二进制格式,则以这种方式阅读。实际上,您无法确定编译器是否未更改偏移量。例如,ID通常会有4个字节的偏移量。但是编译器可以自由地优化它。

      另外,您无法确定IDAge的大小,除非它们大于2个字节。它们通常是4,但在一些64位编译器上(恕我直言,这样的方式是正确的int ==单个单词)thay可能是8.将来可能是16(如果有128位计算机)。你可能认为从来没有,但以同样的方式“为所有人提供了768 K”(那时候很多)。

    3. 如果您尝试以这种方式阅读文本

         }
      }
      

      除非您需要验证输入(在这种情况下,iostreams不是最好的工具):

      class person
      {
      public:
        person (const std::string &first_name,
                const std::string &last_name,
                const std::string &middle_name,
                int                id,
                int                age)
                : m_first_name(first_name),
                  m_last_name(last_name),
                  m_middle_name(middle_name,
                  m_id(id),
                  m_age(age) {}
      private:
        std::string m_first_name, m_last_name, m_middle_name;
        int m_id, m_age;
      };
      // Lots of other code
      std::vector<person> people;
      while(...)
        {
          std::string first_name, last_name, middle_name;
          int id, age;
          in_file >> first_name >> last_name >> middle_name >> id >> age;
          person p(first_name, last_name, middle_name, id, age);
          people.push_back(p);
        }
      

      它可以缩短并且必须填充但是:  1.使用漂亮的C ++功能,例如STL(你不必记住索引,或者你不必担心矢量溢出)  2.它使用文本格式

答案 1 :(得分:0)

  • 我建议使用boost :: serialization来实现相同的目标。
  • 为什么在读一行之前增加linecount?您将myType的第一个元素保留为未初始化。
  • 如果您使用的是文本文件格式,为什么还要使用读取功能?

答案 2 :(得分:0)

几点;

  • 什么是cArray?
  • 您必须使用is_open()
  • 测试打开的文件
  • eof()函数只会在您阅读完
  • 后检测文件结尾
  • 你应该使用std :: getline()来读取行
  • 正如评论中所指出的,你班级中的名字是单个字符,它们应该是std :: strings

答案 3 :(得分:0)

如果您的数据来自文本文件,那么read(buf,size)的方法将无效。 它将使用从输入读取的任何字节填充buf。 你不能以这种方式在内存中的某个地方“填充”对象。 read(buf,size)仅适用于二进制数据。

我会重载流运算符&gt;&gt;做textdata的实际解析。 输出将存储在作为引用传递的对象中:

istream& operator>> (istream& in, MyClass& val );