C ++从ifstream创建一个可变大小的数组

时间:2014-10-13 21:21:26

标签: c++ arrays ifstream

简而言之:我的c ++编程技巧和术语充其量只是中级。所以请温柔;)。

我正在为大学课程开发一种多排序算法。最初,我构建了一个包含20个整数数组的程序,因为它与.txt文件一样大。最后的实验室现在要求接收具有10,100,1000,10000,100000和1000000个不同数字的文件。我最初在for循环中使用ifstream来读取整数。现在我需要从文件中读取可变数量的int,我遇到了这段代码的问题。我已经广泛搜索了这个网站和谷歌找到这个问题的答案。我已经尝试了几十种不同的代码片段,但无济于事。这是我目前运行的代码,可以运行20个整数。

int i;
int A[20];
int length;
char unsortedFilename[200];
ifstream unsorted;

cout << "Please type the full name of the file you would like sorted.\n* ";
cin >> unsortedFilename;
unsorted.open(unsortedFilename);

length = (sizeof(A) / sizeof(*A));

for( i = 0; i < length; i++ )
{
    unsorted >> A[i];
    cout << A[i] << "\n";
}

insertionSort();

我确实有其他代码混合在那里,但它是错误检查,选择重复数字删除等。我希望它这样的代码将运行“i”次,其中“i”实际上是文件中的整数。另外,正如我之前提到的,我需要输入一个包含1,000,000个数字的文件。我不相信int数组能够容纳那么多数字。它会像把所有的东西交换成多头一样容易吗?

感谢您提供的任何帮助。

4 个答案:

答案 0 :(得分:1)

  1. 根据评论中的建议,使用std::vector<int>代替数组。

  2. 使用for循环代替while循环。当没有数字可供阅读时,突破while循环。

  3. while循环:

    std::vector<int> A;
    int item;
    while ( unsorted >> item )
    {
       A.push_back(item);
    }
    

    您可以使用std::vectorstd::vector::iterator进行排序,或只是通过int*返回的A.data()访问数据。

答案 1 :(得分:1)

您可以简单地将所有数字读入矢量。然后像使用数组一样使用向量。

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

int main()
{
  std::string unsortedFilename;
  std::cout << "Please type the full name of the file you would like sorted.\n";
  std::cin >> unsortedFilename;
  std::ifstream is(unsortedFilename);
  std::istream_iterator<int> start(is), end;
  std::vector<int> A(start, end);
  std::cout << "Read " << A.size() << " numbers" << std::endl;

}

答案 2 :(得分:0)

  

需要输入一个包含1,000,000个数字的文件。我不相信int数组能够容纳那么多数字。

当然可以。 1百万英寸是大约4Mb的内存,这是一个微不足道的数量。您甚至可以像现在一样int A[1000000];将其声明为静态。

但真正的问题是你在代码中假定一个固定的长度,而不是从输入中确定长度。我想这就是你的任务所教你的,所以我不会告诉你解决方案。但是考虑使用ifstream::eof并使你的排序接受长度作为参数......

答案 3 :(得分:0)

你想要的是一个载体。

试试这个,

int i;
vector<int> A;
int length;
string unsortedFilename;
ifstream unsorted;

cout << "Please type the full name of the file you would like sorted.\n* ";
cin >> unsortedFilename;
unsorted.open(unsortedFilename);

int temp;
for( i = 0; unsorted >> temp; i++ )
{
    A.push_back(temp);
    cout << A[i] << "\n";
}

insertionSort();

矢量基本上是一个动态数组。它会随着需要更多空间而自动增长。这样,如果您拥有10个,100个甚至100000个项目并不重要,它会自动为您增长。

还使用字符串作为文件名,某些文件名超过200个字符。

祝你好运!