【问题标题】:How can I read specific lines of a text file into an array of type int in C++?如何在 C++ 中将文本文件的特定行读入 int 类型的数组?
【发布时间】:2020-05-22 22:16:11
【问题描述】:

我需要将文本文件读入一个数组。文本文件被格式化,因此第一行包含数组大小,以下几行是数组的元素:

    6
    5
    3
    2
    1
    6
    4

其中数组大小等于6。文件需要以这种格式读取:

a.exe < testfiles/input

这是我目前所拥有的:

int main(){

    int arraySize = 0;

    cin >> arraySize;
    int array[arraySize];

    for(i = 1; i < arraySize; i++){
        cin >> array[i];
    }

    for(j = 0; j < arraySize-1; j++){
        //insertion sort here
    }

}

数组保持全零,但大小正确。谁能看到我的错误?

编辑:我已经修复了要动态分配的数组。程序现在执行没有错误,但现在整个数组都充满了文本文件的第二个条目,在本例中为 5。

【问题讨论】:

  • 数组的大小必须是编译时已知的常量表达式。如果您只知道运行时的大小,请改用vector&lt;int&gt;
  • 使用std::vector&lt;int&gt;,因为直到运行时您才知道大小。
  • 解决此问题所缺少的知识是堆栈与堆内存分配。你不能在堆栈上做动态大小的数组。当您像您所做的那样声明一个数组时,这就是基于堆栈的分配。您只能使用 new 关键字在堆上声明动态大小的数组。见:stackoverflow.com/a/1598409/2516916
  • 这是无效的 C++ 代码。数组大小必须是一个整数 const 表达式。使用动态数组或使用 std::vector。
  • int array[arraySize]; 不是有效的标准 C++。 VLA 是编译器扩展,不是语言功能。使用std::vector

标签: c++ c++11


【解决方案1】:

由于这个问题读起来像家庭作业,我猜你不能使用std。但是,如果您有机会,这里有一个更安全的方法来完成您正在尝试的事情:

#include <iostream>
#include <vector>

using namespace std;

int main(){
    vector<int> nums;

    int arraySize;
    cin >> arraySize;

    for(int i = 0; i < arraySize; i++){
        int value;
        cin >> value;
        nums.push_back(value);
    }

    for (auto num : nums)
        cout << num << " ";

    return 0;
}

【讨论】:

  • 使用向量而不是数组有什么好处?
  • 使用数组需要提前知道大小。使用矢量你不需要。
【解决方案2】:

在 C++ 数组声明中,数组大小必须是 integral const expression。最简单的改变是使用动态数组:。

int main(){
    using namespace std;
    int arraySize = 0;

    cin >> arraySize;
    int * array = new int[arraySize];

    for(int i = 1; i < arraySize; i++){
        cin >> array[i];
    }

    for(int j = 0; j < arraySize-1; j++){
        //insertion sort here
    }
    delete [] array;
}

【讨论】:

  • 虽然这段代码有些奇怪...i 开始于1 而不是0
  • 为什么不只是std::vector??
  • @JesperJuhl,使用vector 也是一个很好的解决方案。我的回答说明了 OP 的代码是如何不正确的。
猜你喜欢
  • 2012-11-28
  • 2020-05-03
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
  • 2010-09-29
相关资源
最近更新 更多