2015-01-20 4 views
1

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

:200:25jan 

Я использую getline (cin, расход); чтобы получить всю строку в строке, но в конечном итоге пустых, нужна помощь, пожалуйста,

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

using namespace std; 
void addExpense(string& expense, double& amount, string& date){ 
cout << "Type of Expense: " << endl; 
getline(cin, expense); 
cin.clear(); 
cin.ignore(100, '\n'); 
cout << "Amount: " << endl; 
cin >> amount; 
cin.clear(); 
cin.ignore(100, '\n'); 
cout << "Transaction Date: " << endl; 
getline (cin, date); 
cin.clear(); 
cin.ignore(100, '\n'); 
} 

int main() { 
char choice; 
bool expenseOn = true; 
while (expenseOn != false){ 
cout << "a) Add Expense\n"; 
cout << "b) Remove Expense\n"; 
cout << "c) Edit Cash Flow item for Expense or Income\n"; 
cout << "d) Net Cash Flow Summary Report\n"; 
cout << "e) Quit\n"; 
cout << "\n"; 
cout << "Please Enter a Choice:\n"; 

cin.clear(); 
cin >> choice; 

string date = "", expense = "", texpense = ""; 
ofstream outfile; 
double amount = 0.0; 

switch (choice){ 
    case 'a': 
     cout << "Add Expense.\n"; 
     //char fileName[20]; 
     /*cout << "Enter filename.." << endl; 
     cin >> fileName;*/ 
     outfile.open ("Expense.txt"); 
     if (!outfile) 
     { 
     cout << "File Storing Failed" << endl; 
     exit(-1); 
     } 
     addExpense(expense, amount, date); 
     outfile << expense << ":" << amount << ":" << date; 
     break; 
    } 
+1

Какой результат вы ожидаете/желания? –

+0

Ваш фрагмент кода не отображается, если вы позже закрываете или удаляете файл. Возможно, в этом и проблема. – BitTickler

ответ

1

Другой возможный ответ на этот вопрос

string expense = "", date = "", type = ""; 
double amount = 0.0; 
ofstream outfile; 
outfile.open ("Expense.txt", std::ios_base::app); 
if (!outfile) 
{ 
cout << "File open fail" << endl; 
exit(-1); 
} 
cout << "Please Enter Expense: "; 
cin.ignore(); 
getline(cin, expense); 
cin.clear(); 
cout << "Amount: " << endl; 
cin >> amount;  
cin.clear(); 
cout << "Transaction Date: " << endl; 
cin.ignore(100,'\n'); 
getline (cin, date); 
outfile << expense << ":" << amount << ":" << date << "\n"; 
+1

Это работает лучше, поскольку я могу разместить несколько строк – Ken

1

Вы НЕПРАВИЛЬНУЮ ignore - вы должны использовать, что тогда и только тогда, когда вам действительно нужно, чтобы перейти к следующей строке.
Когда вы используете getline, вы извлекаете целую строку, включая новую строку, из потока.
Когда вы используете >>, в потоке останутся символы новой строки, которые будут прочитаны позже.

Это то, что происходит:

void addExpense(string& expense, double& amount, string& date){ 
    cout << "Type of Expense: " << endl; 
    getline(cin, expense); // Read the newline that was left after reading 'choice' 
    cin.clear(); 
    cin.ignore(100, '\n'); // Read the line containing the type of expense 
    cout << "Amount: " << endl; 
    cin >> amount;   // Read the amount 
    cin.clear(); 
    cin.ignore(100, '\n'); // Read to the end of line 
    cout << "Transaction Date: " << endl; 
    getline (cin, date);  // Read the line containing the date 
    cin.clear(); 
    cin.ignore(100, '\n'); // Read to the end of line 
} 

(. Вы, возможно, заметили, что вам нужно нажать Enter дважды после даты, чтобы продолжить Второй является то, что окончательное ignore ждет.)

Снимите ignore с после getline с, а затем добавьте его после cin >> choice.