ошибка выполнения ifstream при попытке сохранить данные в массив

У меня проблема, когда я пытаюсь прочитать внешний текстовый файл. Отображаемый текст правильный, но когда дело доходит до сохранения данных в массив, он кажется неправильным.

Мои входные числа 4 2 8 0 2 3 0 4 0 5, но после перебора массива a[i] появляется только «48».

#include <iostream>
#include <windows.h>
#include <fstream>
#include <string>

void begin ();
void Process (string);

using namespace std;

int main()
{   

        begin();

        system("pause");
        return 0;
}

void begin (void){

string file = "data.txt";
Process(file);      
}

void Process (string file)
{

        int i=0,ch, n = 0, temp, a[50];


        ifstream infile;
        infile.open(file.c_str());

Ошибка, кажется, вызвана отсюда.

        if(infile.is_open())
        {

            cout << "File to be read: " << file << endl;
            cout << "\n\n";
            infile >> temp;
            while(!infile.fail())
            {
                cout << temp << " ";
                infile >> temp;
                a[i] = temp;
                i++;
                n++;
            }

        cout << "\n\n";
        cout << "This file has " << n << " numbers. \n\n";

        }

        else
            cout << "The file isn't available! \n\n";

        infile.close(); 

Когда я пытаюсь вывести результат, появляется только 48.

        for (int z = 0; z < i; z++)
        {
            cout << a[i] << endl;

        }
}

Я здесь новенький. Пожалуйста помоги. Заранее спасибо.


person Kimi    schedule 17.12.2013    source источник


Ответы (2)


Ваш цикл отображения использует i вместо z для индексации в a (это должно быть хорошим уроком о том, почему важно именование переменных!) Измените свой цикл отображения на это:

    for (int z = 0; z < i; z++)
    {
        cout << a[z] << endl;
    }

Есть потенциально больше проблем с вашим кодом, но это, похоже, то, что вас блокирует. Попробуйте переименовать i и a в более значимые вещи. Время, которое вы потратите на набор текста, всегда будет меньше времени, которое вы потратите на то, чтобы понять, что вы имели в виду.

person Sam Cristall    schedule 17.12.2013

Рассмотрим этот цикл

    for (int z = 0; z < i; z++)
    {
        cout << a[i] << endl;

    }

Вы всегда выводите один элемент a[i] вместо a[z]. Более того, элемент с индексом i не был назначен. Последний назначенный элемент — это a[i-1].

Кроме того, вы не сохраняете первое введенное число в массиве. Вы начинаете сохранять введенные данные со второго номера.

        infile >> temp; // <== this value was not assigned to an element of the array
        while(!infile.fail())
        {
            cout << temp << " ";
            infile >> temp;
            a[i] = temp;

Также этот оператор внутри цикла

            infile >> temp;

может привести к ошибке. Так что после этого нет смысла писать

            a[i] = temp;

потому что ничего не было введено, и фактически вы сохраните предыдущее число в следующем элементе.

person Vlad from Moscow    schedule 17.12.2013