Lees gegevens uit een bestand in een array – C++

Ik wil de gegevens uit mijn invoerbestand lezen

70 95 62 88 90 85 75 79 50 80 82 88 81 93 75 78 62 55 89 94 73 82

en sla elke waarde op in een array. Er is meer aan dit specifieke probleem (de andere functies zijn voorlopig niet becommentarieerd) maar dit is wat me echt problemen geeft. Ik heb uren naar de vorige vraag over data en arrays gekeken, maar ik kan niet vinden waar ik de fout maak.

Hier is mijn code:

#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;
}

en hier is mijn output:

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

Bedankt voor uw tijd.


Antwoord 1, autoriteit 100%

Het probleem is dat je een lokale grades-array declareert met een grootte van 1, waarbij de globale grades-array wordt verborgen. Niet alleen dat, je hebt nu toegang tot de array buiten de grenzen, aangezien de lokale gradesarray maar 1 item kan bevatten.

Dus weg met de regel:

int grades[i];

Er moet echter worden vermeld dat dit:

int i = 0;
int grades[i];

is geen geldige C++-syntaxis. Je bent hier per ongeluk tegenaan gelopen, maar die code zou niet worden gecompileerd als deze werd gecompileerd met een strikte ANSI C++-compiler.

Een array in C++ moet worden gedeclareerd met een constante expressie om het aantal items in de array aan te geven, niet een variabele. U gebruikt per ongeluk een niet-standaard compiler-extensie genaamd Variable Length Arraysof kortweg VLA’s.

Als dit voor een schoolopdracht is, declareer dan geen arrays op deze manier (zelfs als je het zo bedoeld had), want het is officieel geen C++. Als je een dynamische array wilt declareren, is dat waar std::vectorvoor is.


Antwoord 2, autoriteit 100%

Ik zie geen enkel probleem bij het lezen van het bestand, je hebt zojuist de globale versus lokale variabele van cijfers verward

Je hebt dit niet nodig

int i = 0;
int grades[];

Binnen de functie 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;
}


Antwoord 3, Autoriteit 100%

Uw originele globale array grades, van grootte 22, wordt vervangen door de lokale array met dezelfde naam maar van grootte 0.
(Het wordt niet overschreven, alleen elke code met behulp van de variabele grades, in de reikwijdte die de tweede is gedefinieerd, zal de waarde van de tweede gradesARRAY, zoals het heeft een hogere precedentie.)

zowel inFile >> grades[i];en cout << grades[i] << " ";moet runtime-fouten retourneren terwijl u buiten hun formaat leest (het lijkt erop dat u geen strikte compiler gebruikt).
[int grades[i];zou een compileertijdfout normaal retourneren, omdat u niet / meestal geen vaste array met een variabele]

kunt initialiseren

Ik denk dat wat er gebeurt, in plaats van je programma crasht, is dat grades[i]gewoon een anonieme exemplaar van een variabele met waarde 0 retourneren, vandaar.

De eenvoudigste oplossing voor uw probleem zou zijn om gewoon te verwijderen int grades[i].
(Verwijder ook een van de int i = 0‘S, zoals u niet nodig hebt om twee keer te worden gedefinieerd)

Other episodes