2015-06-07 81 views
-1

我要讀一個輸入文件calls_history.txt就是這個樣子建議使用固定我的代碼

Mo 13:30 16 
Mo 8:15 35 
Tu 7:50 20 
We 17:45 30 
Th 8:00 45 
Su 23:50 30 

,然後計算每個電話的費用。到目前爲止,這就是我得到的。

#include <iostream> 
 
#include <fstream> 
 
#include <string> 
 
#include <sstream> 
 
#include <iomanip> 
 

 
using namespace std; 
 

 
int main() 
 
{ 
 
    ifstream inFile; 
 
    string filename, day, Mo, Tu, We, Th, Fr, Sa, Su; 
 
    int duration; 
 

 
    string time_start; 
 
    int hour_start, minute_start; 
 
    double TotalCost, cost_1, cost_2; 
 

 
    cout << "Enter filename: "; 
 
    cin >> filename; 
 

 
    cout << "Day" << "\tTime" << "\tDuration" << "\tCost" << endl; 
 
    cout << "----------------------------------------------" << endl; 
 

 
    inFile.open (filename.c_str()); 
 
    string line; 
 

 
    if (inFile) 
 
    { 
 
//read records from file 
 
    while (getline (inFile, line)) 
 
    { 
 
     stringstream iss(line); 
 

 
    //split into 3 fields 
 
     while(iss) 
 
    { 
 
     iss >> day; 
 
     iss >> hour_start; 
 
     iss >> minute_start; 
 
     iss >> duration; 
 
    } 
 
     if (day == "Mo" || day == "Tu" || day == "We" || day == "Th" || day == "Fr") 
 
     { 
 
       if (hour_start >= 8 && hour_start <= 18) 
 
       { 
 
        TotalCost = duration*0.40; 
 
       } 
 
       if ((hour_start = 7, minute_start < 60) && (minute_start+duration >= 60)) 
 
       { 
 
        cost_1 = (60-minute_start)*0.25; 
 
        cost_2 = ((duration-(60-minute_start))*0.40); 
 
        TotalCost = cost_1+cost_2; 
 
       } 
 
       if (hour_start < 8 && hour_start >= 18) 
 
       { 
 
        TotalCost = duration*0.25; 
 
       } 
 
     } 
 
     if (day == "Sa" || day == "Su") 
 
     { 
 
       if ((hour_start =23 && minute_start <60)&& (minute_start+duration >=60)) 
 
       { 
 
        cost_1 = (60-minute_start)*0.15; 
 
        cost_2 = ((duration-(60-minute_start))*0.25); 
 
        TotalCost = cost_1+cost_2; 
 
       } 
 
       else 
 
       { 
 
        TotalCost = duration*0.15; 
 
       } 
 
     } 
 

 
    cout << day << "\t" << hour_start <<":" << minute_start << "\t" << duration << "\t\t$"; 
 
    cout << setprecision(2) << fixed << TotalCost << endl; 
 

 
     inFile.close(); 
 
    } 
 
    } 
 
    return 0; 
 
}

我測試了它,只得到了這樣的結果

Enter filename: calls_history.txt 
 
Day  Time Duration  Cost 
 
---------------------------------------------- 
 
Mo  7:30 16    $6.40 
 

 
Process returned 0 (0x0) execution time : 3.622 s 
 
Press any key to continue.

任何建議,這樣我可以顯示所有其他行和DATAS? 我要使它看起來像這樣

Day \t Time \t Duration \t Cost 
 
Mo \t 13:30 \t 16 \t   $6.40 
 
Mo \t 8:15 \t 35 \t   $14.00 
 
Tu \t 7:50 \t 20 \t   $6.50 
 
We \t 17:45 \t 30 \t   $9.75 
 
Th \t 8:00 \t 45 \t   $18.00 
 
Su \t 23:50 \t 30 \t   $6.50 
 
Total \t       $61.15

+1

你單步調試代碼,行由行,在調試器? – OldProgrammer

+3

'if(day ==「Mo」,「Tu」,「We」,「Th」,「Fr」)'really? – Galik

+0

是的,很明顯我是一個noob – Aki12

回答

0

問題是因爲文件關閉的位置不好的。

while (getline(inFile, line)) 
{ 
    ...parsing... 
    inFile.close(); 
} 

你想:

while (getline(inFile, line)) 
{ 
    ...parsing... 
} 
inFile.close(); 

但你並不需要顯式地關閉文件反正。 ifstream當函數結束時inFile超出範圍時,析構函數將會處理它。

下一個問題你會碰到:

iss >> day; // read stream up to whitespace into string 
iss >> hour_start; // read stream until not int into int 
iss >> minute_start; // read stream until not int into int 
iss >> duration; // read stream until not int into int 

輸入:

Mo 13:30 16 

會發生什麼:

iss >> day; // reads "Mo" 
iss >> hour_start; // reads 13 
iss >> minute_start; // tries to read ':' as int, fails 
iss >> duration; // previous error not cleared. Fails 

讀取失敗並沒有測試和處理。分鐘開始和持續時間未使用。可笑的hi-jinks隨之而來。

嘗試,而不是:

char colon; 
if (iss >> day >> hour_start >> colon >> minute_start >> duration && (colon == ':')) 
{ 
    do calculations 
} 
else 
{ 
    notify user of bad file 
}