将文件中的数据读入数组 - C ++

时间:2017-11-22 04:14:57

标签: c++ file-io

我想从输入文件中读取数据

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 

感谢您的时间。

3 个答案:

答案 0 :(得分:1)

我在阅读文件时没有看到任何问题,你只是混淆了成绩的全局与局部变量

你不需要这个

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

答案 1 :(得分:1)

问题是您声明了一个大小为1的本地grades数组,隐藏了全局grades数组。不仅如此,您现在正在访问超出边界的数组,因为本地grades数组只能容纳1个项目。

所以摆脱界限:

int grades[i];

但是,需要提到的是:

int i = 0;
int grades[i];

是无效的C ++语法。您错误地偶然发现了这一点,但如果使用严格的ANSI C ++编译器进行编译,则代码将无法编译。

必须使用常量表达式声明C ++中的数组,以表示数组中的条目数,而不是变量。您不小心使用了一个名为可变长度数组或VLA的非标准编译器扩展。

如果这是针对学校作业的,不要以这种方式声明数组(即使你打算这样做),因为它不是正式的C ++。如果要声明动态数组,那就是std::vector的用途。

答案 2 :(得分:1)

原始全局数组grades,大小为22,将由具有相同名称但大小为0的本地数组替换。
(它没有被覆盖,只是使用变量grades的任何代码,在第二个定义的范围内,将读取第二个grades数组的值,因为它具有更高的优先级。)

当您阅读超出其大小时,inFile >> grades[i];cout << grades[i] << " ";都应返回运行时错误(看起来您没有使用严格的编译器)。
[int grades[i];通常会返回编译时错误,因为您不应该/通常无法使用变量初始化固定数组

我认为正在发生的事情,而不是程序崩溃,是grades[i]只是返回一个值为0的变量的匿名实例,因此输出。

对您的问题最简单的解决方法是删除int grades[i]
(同时删除其中一个int i = 0,因为您不需要定义两次)