грешка по време на изпълнение на 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