将数据从文件读入数组 - C++

3
我想从我的输入文件中读取数据。
70 95 62 88 90 85 75 79 50 80 82 88 81 93 75 78 62 55 89 94 73 82

将每个值存储在数组中。这个特定的问题还有更多内容(其他函数现在已注释),但这是我真正遇到麻烦的地方。我花了数小时查看有关数据和数组的先前问题,但我找不到我的错误所在。

这是我的代码:

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

using namespace std;

const int SIZE = 22;
int grades[SIZE];

void readData() {

    int i = 0;
    int grades[i];

    string inFileName = "grades.txt";
    ifstream inFile;
    inFile.open(inFileName.c_str());

    if (inFile.is_open())  
    {
        for (i = 0; i < SIZE; i++) 
        {
            inFile >> grades[i];
            cout << grades[i] << " ";
        }

        inFile.close(); // CLose input file
    }
    else { //Error message
        cerr << "Can't find input file " << inFileName << endl;
    }
}
/*
    double getAverage() {

        return 0;
    }

    void printGradesTable() {

    }

    void printGradesInRow() {

    }


    void min () {
        int pos = 0;
        int minimum = grades[pos];

        cout << "Minimum " << minimum << " at position " << pos << endl;
    }

    void max () {
        int pos = 0;
        int maximum = grades[pos];

        cout << "Maximum " << maximum << " at position " << pos << endl;
    }

    void sort() {

    }
*/


int main ()
{
    readData();
    return 0;
}

这是我的输出结果:

 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

谢谢您的时间。

2
x[i] -- 我在找,但是我没有看到 x 被声明的地方。这可能意味着你匆忙地直接在编辑窗口中输入了代码,而不是复制粘贴你实际的程序。 - undefined
你正在读取变量$x$中的数据,但是你在哪里声明了$x$? - undefined
2
另外,int grades[i]; 这一行的作用是什么? - undefined
1
你正在使用 C++,有什么原因你不使用 std::vector 吗? - undefined
2
@dev_P int grades[i]; -- 再次解释一下这行代码的作用或者你期望它做什么。这甚至不是有效的C++语法,更别说在执行这行代码时i的值为0了。 - undefined
显示剩余4条评论
3个回答

5
问题在于你声明了一个大小为1的本地“grades”数组,隐藏了全局“grades”数组。不仅如此,你现在正在访问超出边界的数组,因为本地“grades”数组只能容纳一个项目。
所以删除以下这行代码:
int grades[i];

需要提及的是,这个:

int i = 0;
int grades[i];

这不是有效的C++语法。你可能是无意中进入了这种情况,但是如果使用严格的ANSI C++编译器编译代码,那么它将无法编译。

C++中的数组必须使用常量表达式来声明数组中条目的数量,而不是变量。您意外地使用了一个名为"可变长度数组(Variable Length Arrays)"或缩写VLA的非标准编译器扩展。

如果这是学校作业,请不要以这种方式声明数组(即使您本意如此),因为它不是正式的C++语法。如果想声明动态数组,可以使用std::vector。


我不知道为什么大多数学院或大学要求学生使用旧的C++风格,而现在有更好的替代方案可用。 - undefined
谢谢PaulMcKenzie。有没有一种方法可以在不使用向量的情况下存储数据到数组中?你能帮我修复我的代码吗?如果我编译@HariomSingh编辑过的代码,仍然得到全零的结果。我在Mac和Windows电脑上都尝试过这个问题。 - undefined
修复你自己的代码 @dev_P - undefined

2

我认为读取文件没有任何问题,你只是混淆了成绩的全局变量和局部变量

这个不需要

int i = 0;
int grades[];

在readData函数内部

#include <string>

using namespace std;

const int SIZE = 22;
int grades[SIZE];

void readData() {


    string inFileName = "grades.txt";
    ifstream inFile;
    inFile.open(inFileName.c_str());

    if (inFile.is_open())
    {
        for (int i = 0; i < SIZE; i++)
        {
            inFile >> grades[i];
            cout << grades[i] << " ";
        }

        inFile.close(); // CLose input file
    }
    else { //Error message
        cerr << "Can't find input file " << inFileName << endl;
    }
}

int main()
{
    readData();
    return 0;
}

Output


我没有看到任何问题 - 看看我的答案。有一个很大的问题。 - undefined
我的意思是说读取文件时没有问题。因为OP的问题是“从文件中读取数据到数组 - C ++”。 - undefined
@dev_P 如果你无法获得所需的输出,请添加更多信息 - undefined

1
您原来的全局数组grades,大小为22,被同名但大小为0的局部数组所替换。
(它没有被覆盖,只是在第二个数组定义的范围内使用变量grades的任何代码将读取第二个grades数组的值,因为它具有更高的优先级。) inFile >> grades[i];cout << grades[i] << " ";两者都应该返回运行时错误,因为您正在超出其大小(似乎您没有使用严格的编译器)。 [int grades[i];通常会返回编译时错误,因为您不应该/通常无法使用变量初始化固定数组]
我认为发生的事情是,您的程序没有崩溃,而是grades[i]只是返回一个匿名变量实例,其值为0,因此输出了这个结果。
解决问题最简单的方法就是删除int grades[i]。 (还要删除其中一个int i = 0,因为您不需要定义两次)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接