Я пытаюсь ввести данные в массив, который может содержать до 200 переменных или до тех пор, пока не достигнет конца файла. Будет ли это работать или будет продолжаться добавление, если в файле более 200 переменных? Вот что я написал до сих пор:

Также как бы вы вывести это в обратном порядке, не печатая 0 в элементах, которым ничего не назначено?

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

using namespace std;

const int SIZE = 200;
int tripNumber[SIZE];
double finalTrip[SIZE];
double fuel, waste, misc, discount, final;
double totalFuel, totalWaste, totalMisc, totalDiscount, totalFinal;


int main()
{
cout << "Welcome to NAME's Space Travel Company" << endl;
cout << "Trip No" << "\t" << "Fuel" << "\t" << "Waste" << "\t" << "Misc" << "\t"   << "Discount Fuel" << "\t" << "Final Cost" << endl;

ifstream inp_1("TripInput.txt");

    for(int i = 0; i = !inp_1.eof(); i++)
    {
        inp_1 >> tripNumber[i] >> fuel >> waste >> misc;
        discount = fuel - (fuel * .10);
        final = discount + waste + misc;

        totalFuel += fuel;
        totalWaste += waste;
        totalMisc += misc;
        totalDiscount += discount;
        totalFinal += final;

        cout << setprecision(0) << tripNumber[i];
        cout << setprecision(2) << fixed << "\t " << fuel << "\t " << waste << "\t " << misc << "\t " << discount << "\t\t" << final << endl;

        finalTrip[i] = final;
    }


cout << "Totals" << "\t" << totalFuel << "\t" << totalWaste << "\t " << totalMisc << "\t " << totalDiscount << "\t\t" << totalFinal << endl;

inp_1.close();

system("PAUSE");
return 0;

}

0
Crainey2 23 Апр 2014 в 01:03

3 ответа

Лучший ответ

Попробуйте управлять своим циклом следующим образом:

for(int i = 0; i < SIZE; i++)
{
    inp_1 >> tripNumber[i] >> fuel >> waste >> misc;
    if (!inp_1)
        break;
    // etc...
}

Вы должны проверить статус файла сразу после ввода команды, как указано выше. Цикл for гарантирует, что массив не переполнится.

1
ooga 22 Апр 2014 в 21:09

Вы не проверяете, превышает ли количество записей в файле SIZE.

Также непонятно, почему вы определили переменные как глобальные. По крайней мере, топливо, отходы и прочее могут быть локальными переменными контура.

На мой взгляд правильнее было бы написать

std::ifstream inp_1( "TripInput.txt" );

int i = 0;
std::string record;
while ( i < SIZE && std::getline( inp_1, record ) )
{
    if ( record.find_first_not_of( " " ) == std::string::npos ) continue;

    int fuel = 0, waste = 0, misc = 0;

    std::istringstream is( record );
    is >> tripNumber[i] >> fuel >> waste >> misc;

    discount = fuel - (fuel * .10);
    final = discount + waste + misc;

    totalFuel += fuel;
    totalWaste += waste;
    totalMisc += misc;
    totalDiscount += discount;
    totalFinal += final;

    std::cout << std::setprecision( 0 ) << tripNumber[i];
    std::cout << std::setprecision( 2 ) << std::fixed << "\t " 
                                        << fuel << "\t " 
                                        << waste << "\t " 
                                        << misc << "\t " 
                                        << discount << "\t\t" 
                                        << final << std::endl;

    finalTrip[i] = final;

    ++i;
}
0
Vlad from Moscow 22 Апр 2014 в 21:22

Пытаться

for(int i = 0; i < 200 && !inp_1.eof(); i++)
{
    // .....
}
0
CiaPan 22 Апр 2014 в 21:11