С++ Чтение нескольких целых чисел из текстового файла

Я начинаю изучать С++, и мне трудно заставить мой код читать несколько целых чисел из текстового файла.

Моя задача состоит в том, чтобы взять уже существующий код (код, который я разместил ниже) и изменить его, чтобы вместо ввода данных пользователем он читал из текстового файла.

Основная проблема, с которой я сталкиваюсь, заключается в функции void getNumber. Первоначально это был простой оператор cin, который считывал 20 введенных пользователем чисел, переносил их в основную функцию, обрабатывал их в другой функции, а затем печатал результаты в последней.

Я изменил код для успешного чтения текстового файла, однако он считывает только первое значение текстового файла (например, текстовый файл читает: 1 2 3 4... 20), а вывод читает: 1 1 1 1 1. ..

Я часами искал решения, к сожалению, многие ответы требуют вещей, с которыми я не знаком. Кажется, мне нужно будет установить какой-то цикл? Я не уверен.

Спасибо!

#include <iostream> 
#include <iomanip>
#include <fstream>

using namespace std;

 const int N = 20;   

    //Function prototypes
void initialize(int& zeroCount, int& oddCount, int& evenCount);
void getNumber(int& num);
void classifyNumber(int num, int& zeroCount, int& oddCount, 
                    int& evenCount);
void printResults(int zeroCount, int oddCount, int evenCount);

int main ()
{
        //Variable declaration
    int counter; //loop control variable 
    int number;  //variable to store the new number 
    int zeros;   //variable to store the number of zeros 
    int odds;    //variable to store the number of odd integers 
    int evens;   //variable to store the number of even integers 



    initialize(zeros, odds, evens);                 //Step 1

    cout << "Please enter " << N << " integers."
         << endl;                                   //Step 2
    cout << "The numbers you entered are: "
         << endl;

    for (counter = 1; counter <= N; counter++)      //Step 3
    {
        getNumber(number);                          //Step 3a
        cout << number << " ";                      //Step 3b
        classifyNumber(number, zeros, odds, evens); //Step 3c
    }// end for loop 

    cout << endl;

    printResults(zeros, odds, evens);               //Step 4

    return 0;
}

void initialize(int& zeroCount, int& oddCount, int& evenCount)
{
    zeroCount = 0;
    oddCount = 0;
    evenCount = 0;
}

void getNumber(int& num)
{
    ifstream inData;


    inData.open("inputfile.txt");
    inData >> num;




}

void classifyNumber(int num, int& zeroCount, int& oddCount,
                    int& evenCount)
{
    switch (num % 2)
    {
    case 0: 
        evenCount++;  
        if (num == 0)
            zeroCount++;  
        break;
   case 1: 
   case -1: 
       oddCount++;
   } //end switch
} //end classifyNumber

void printResults(int zeroCount, int oddCount, int evenCount)
{ 

    ofstream outData;


    outData.open("outputfile.txt.");

    outData << "There are " << evenCount << " evens, "
         << "which includes " << zeroCount << " zeros"
         << endl;

    outData << "The number of odd numbers is: " << oddCount
         << endl;
    outData.close();
} //end printResults

person user3417390    schedule 16.03.2014    source источник
comment
Да, вам нужна петля. Теперь вы читаете только первый номер (один звонок в Data ›› num).   -  person user2672165    schedule 16.03.2014


Ответы (2)


Что происходит, так это то, что вы открываете файл каждый раз внутри функции getNumber. При этом вы всегда начинаете чтение файла с самого начала. Что вы хотите сделать, так это каждый раз читать следующее целое число, а не одно и то же. Для этого вы можете открыть файл из основной функции и передать ifstream функции getNumber.

int main ()
{
    ...

    ifstream inpStream;
    inpStream.open("inputfile.txt");

    for (counter = 1; counter <= N; counter++)      //Step 3
    {
        getNumber(number, inpStream);                          //Step 3a
        cout << number << " ";                      //Step 3b
        classifyNumber(number, zeros, odds, evens); //Step 3c
    }// end for loop 

    return 0;
}

void getNumber(int& num, istream& inpStream)
{
    inpStream >> num;
}

Обратите внимание, что таким образом вы можете определить inpStream как cin, и это тоже будет работать. Это потому, что функция getNumber получает ссылку на istream (которым является cin).

person Vadiklk    schedule 16.03.2014
comment
А, теперь я вижу. Я смог заставить это работать и внести необходимые дополнительные изменения. Большое спасибо! - person user3417390; 16.03.2014

Проблема в том, что в функции getNumber вы открываете файл каждый раз, когда он вызывается. Это заставляет каждый раз начинать чтение сначала.

person Some programmer dude    schedule 16.03.2014