【问题标题】:How to read from file and dynamically allocate an array of int如何从文件中读取并动态分配一个int数组
【发布时间】:2013-08-11 10:32:58
【问题描述】:

我需要读取一些包含大量数字 (int) 的文件。每个文件的行都不一样。

1
3
5
2
1
3
2

我必须读取其中一个文件并动态创建一个 int 数组。 我将读取文件两次,因为我无法知道文件的长度。 你知道另一种方法吗? 这就是我所做的:

int main()
{
    int *array;
    int tmp, count;

    ifstream fin("inputfile");

    while(fin >> tmp)
        count++;

    array = new int[count];

    fin.close();
    fin.open("inputfile");
    int i=0;
    while(fin >> tmp)
        array[i++]=tmp;

    delete[] array;
    return 0;
}

感谢您的帮助。

【问题讨论】:

  • 你可以用std::vector,那样会更简单吗?
  • 有什么理由不这样做吗?您正在使用 c++。
  • 我的老师还是没有解释。
  • 幸运的是,下面的两个投票答案都解释了如何在这种情况下完美地使用它们。
  • @DeniseMendezGomez 那么你也不能使用new 或C 风格的数组,因为你的老师不会解释它们。其中,如果他在std::vector之前解释过,他完全没有能力教C++。

标签: c++ arrays visual-c++


【解决方案1】:

如果所有文件的一行中的int数相同,则可以通过计算文件的大小来获得文件的行数,然后该文件的行数等于size(file)/( n*sizeof(int)),n 是每行的 int 数。我认为您可以尝试而不是两次读取文件。

【讨论】:

  • 那么,请告诉我,他要如何获得它的大小? (实际上,准确测量大小的唯一方法是读取文件,并计算您读取的字节数。)
  • 更不用说表示int 所需的字符数可能会有所不同。
  • 很容易知道文件包含多少字节,因为您可以通过API函数读取有关文件属性的结构成员。值得一提的是,这种方式适用于每行相同数字 int 的情况,不是吗?还有一个 int 包含多少字节也不是问题,因为它对一台机器的最终结果没有影响
  • 操作系统在文件中看到的字节数不一定与您可以从文件中读取的字节数相同。 sizeof(int) 与文本文件无关。对于他显示的数据,所有整数都是一位数,他的文件在 Unix 上每个 int 包含 2 个字节,在 Windows 下包含 3 个字节。但是,这仅适用于只有一位数的整数,并且没有额外的空格。
【解决方案2】:

如果你不想使用std::vector,你可以在while循环中添加一个计数,如果达到数组的上限,重新分配另一个大小*2的缓冲区并将数据复制到它,然后重新开始读取文件。

向量使用相同的逻辑。

【讨论】:

  • 乘数可能会有所不同。 (对于std::vector,我已经看到了 2 和 1.5。)
  • 1.5?我不知道。谢谢!
【解决方案3】:

这是从文件中读取数字到std::vector<int> 的惯用方法:

#include <iostream>
#include <iterator>
#include <fstream>
#include <vector>

int main()
{
  std::ifstream is("inputfile");
  std::istream_iterator<int> start(is), end;
  std::vector<int> numbers(start, end);
  std::cout << "Read " << numbers.size() << " numbers" << std::endl;
}

【讨论】:

  • +1:我正要发布完全相同的内容,但你抢先了! :-)
【解决方案4】:

使用std::vector 而不是原始数组。

这样,您可以在读取每个项目时添加到向量中,而不必读取文件一次以计算文件中有多少项目,然后再次填充数组。

int main()
{
    std::vector<int> data;
    int tmp;

    ifstream fin("inputfile");

    while(fin >> tmp)
    {
        data.push_back(tmp)
    }

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2015-01-13
    • 2020-01-22
    相关资源
    最近更新 更多