首页 > 解决方案 > 数组大小由输入文件中的行数定义

问题描述

我正在读取一个文件并将条目放入一个数组中,但我想根据输入文件中包含的行数来定义数组的大小。

这是我的代码:

int main(int argc, char* argv[])
{
   ifstream infile;

   int num = 0;
   int id[9999];
   int size = sizeof id/ sizeof id[0];

   infile.open("test.dat");
   if(infile.fail())
   {
       cout << "error" << endl;
       return 1;
   }

   while(!infile.eof())
   {

    infile >> id[num];

    ++num;
   }

// Then I do whatever I want...
 for(int i=0;i<size;i++)
   {
     ...
   }

问题是我必须根据 test.dat 文件中包含的行数(例如 9999)手动定义 id[] 的大小。

有没有办法自动定义 id[] 的大小?

标签: c++arrayssize

解决方案


由于这是 C++,最好的方法是使用std::vector.

当您对向量执行push_back()操作时,它的大小会自动增加一,您不必担心大小,因为它会根据您执行的插入/删除进行调整。

所以你的代码现在会是这样的:

#include <vector>

int main(int argc, char* argv[])
{
   ifstream infile;

   int num = 0;
   std::vector<int> id;

   infile.open("test.dat");
   ...

   int value;
   while(!infile.eof())
   {
     infile >> value;
     id.push_back(value);
   }

   for(int i = 0; i < id.size(); i++)
   {
      std::cout << id[i] << "\n";
   }
   ...
}

现在,如果您想真正坚持使用原始数组(例如,您将在 C 中这样做),那么一种可能的方法(虽然不建议)是读取整个文件一次并计算那里有多少个 ID。然后,为该大小的数组动态分配内存。之后,您需要在文件开头倒回文件指针,并开始解析文件以填充数组。当您不再需要该数组时,您必须释放为它分配的内存。

请注意,在这种情况下必须动态分配数组,因为可变大小的数组不是标准 C++


推荐阅读