2017-02-01 7 views
0

Идея программы: консоль предложит пользователю ввести информацию о потреблении топлива. После ввода полного набора данных (дата, количество, бренд и пробег), и я продолжаю работать с программой, регистрируясь столько, сколько хочу, и, наконец, решил вывести текст в блокнот, текстовый документ покажет мне все записи, в которые я ввел ключ. Цикл for работает так, как будто он должен бесконечно зацикливаться до тех пор, пока пользователь не вводит «N» или «n».Как перемещаться по потоку в C++?

ВОПРОС: Моя проблема заключается в том, что независимо от того, сколько записей я вставляю и продолжаю, мой выходной текстовый документ будет показывать только последнюю введенную мной запись. Почему это так?

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    int count = 0; 
    double amount, mileage; 
    string date, brand; 
    char ans; 

    cout << "****************************" << endl; 
    cout << "CAR FUEL CONSUMPTION HISTORY" << endl; 
    cout << "****************************" << endl; 

    for (;;) 
    { 
     cout << "\nDate (dd/mm/yy): "; 
     cin >> date; 

     cout << "Amount Payable: $"; 
     cin >> amount; 

     cout << "Brand: "; 
     cin >> brand; 

     cout << "Mileage (km): "; 
     cin >> mileage; 

     cout << "\nContinue? (Y/N): "; 
     cin >> ans; 

     if (ans == 'N' || ans == 'n') 
     { 
      break; 
     } 
     else 
     { 
      count++; 
     } 
    } 

    ofstream openFile; 
    openFile.open("conHist.txt"); 

    // NOT WORKING!!!! >:(
    while(openFile.good()) 
    { 
     openFile << "Entry " << count << endl;; 
     openFile << "Date (dd/mm/yy): " << date << endl; 
     openFile << "Amount Payable: $" << amount << endl; 
     openFile << "Brand: " << brand << endl; 
     openFile << "Mileage: " << mileage << "km" << endl; 
     openFile.close(); 
    } 

    return 0; 
} 
+2

Добро пожаловать на переполнение стека. Пожалуйста, найдите время, чтобы прочитать [The Tour] (http://stackoverflow.com/tour) и обратитесь к материалу из [Справочного центра] (http://stackoverflow.com/help/asking) о том, что и как вы можете спросите здесь. –

+0

Разве вы не должны писать в файл в цикле for? – NathanOliver

+0

Извините! Я не умею программировать. У меня просто есть модуль в школе, который требует программирования :(Ум, помогающий мне с помощником по исправлению кода? – ErrFunn

ответ

0

Вы не хранить ваши данные, но перезаписывать ее в цикле:

for (;;) 
{ 
    cout << "\nDate (dd/mm/yy): "; 
    cin >> date; 

    cout << "Amount Payable: $"; 
    cin >> amount; 

    cout << "Brand: "; 
    cin >> brand; 

    cout << "Mileage (km): "; 
    cin >> mileage; 

    cout << "\nContinue? (Y/N): "; 
    cin >> ans; 

    if (ans == 'N' || ans == 'n') 
    { 
     break; 
    } 
    else 
    { 
     count++; 
    } 
} 

Вы должны поместить данные в некоторый тип контейнера как std::vector.

Кроме того, я рекомендую создать структуру, чтобы держать все данные для одной записи:

struct Fuel_Record 
{ 
    std::string date; 
    double  amount; 
    std::string brand; 
    double  mileage; 
}; 

Вы можете создать контейнер для хранения всех данных, которые Вы собрали:

std::vector<Fuel_Record> fuel_database; 

Ваш входной контур может быть изменен:

Fuel_Record f; 
for (;;) 
{ 
    cout << "\nDate (dd/mm/yy): "; 
    cin >> f.date; 

    cout << "Amount Payable: $"; 
    cin >> f.amount; 

    cout << "Brand: "; 
    cin >> f.brand; 

    cout << "Mileage (km): "; 
    cin >> f.mileage; 

    // Add the record to the container 
    fuel_database.push_back(f); 

    cout << "\nContinue? (Y/N): "; 
    cin >> ans; 

    if (ans == 'N' || ans == 'n') 
    { 
     break; 
    } 
    else 
    { 
     count++; 
    } 
} 

Edit 1: Не s toring the data
Возможно, вы не узнали о контейнерах или структурах. В этом случае вам нужно будет процесс данные после того как вы собрали его:

double total_payable = 0.0; 
double total_mileage = 0.0; 
for (;;) 
{ 
    cout << "\nDate (dd/mm/yy): "; 
    cin >> date; 

    cout << "Amount Payable: $"; 
    cin >> amount; 

    cout << "Brand: "; 
    cin >> brand; 

    cout << "Mileage (km): "; 
    cin >> mileage; 

    cout << "\nContinue? (Y/N): "; 
    cin >> ans; 

    // Process the collected data: 
    total_mileage += mileage; 
    total_payable += payable; 

    if (ans == 'N' || ans == 'n') 
    { 
     break; 
    } 
    else 
    { 
     count++; 
    } 
} 
+0

Я добавил в структуру вы рекомендовали и создали контейнер и внесли следующие изменения в цикл for. Однако, когда я пытаюсь его построить, он вызывает ошибку: «Fuel_database не объявлялось в этой области».:/Спасибо за помощь, которую человек действительно делает оцените это! – ErrFunn

+0

okay Я привел структуру вне int Main(), и теперь она позволяет мне ее строить, после запуска программы и открытия текстового документа она не записывала дату и бренд, а количество и пробег приходят странно. «S, как выглядит результат: Входа 1 Дата (дд/мм/гг): Сумма оплачивается: $ 2.48473e-200 Марка: Пробег: 6.95314e-308km – ErrFunn

Смежные вопросы