2011-05-03 123 views
1

我想不通,爲什麼這不會從我的文件中讀取...從文件(C++)閱讀

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <fstream> 
using namespace std; 

int main() 
{ 
    int acctNum; 
    int checks; 
    double interest; 
    double acctBal; 
    double monthlyFee; 
    const int COL_SZ = 3; 
    ifstream fileIn; 
    fileIn.open("BankAccounts.txt"); 
    if(fileIn.fail()) 
    { 
     cout << "File couldn't open." << endl; 
    } 
    else 
    { 
     cout << left; 
     cout << "Bank Account records:" << endl; 
     cout << setw(COL_SZ) << "Account#" << setw(COL_SZ) << 
      "Balance" << setw(COL_SZ) << "Interest" << setw(COL_SZ) << "Monthly Fee" << setw(COL_SZ) << 
      "Allowed Checks" << setw(COL_SZ) << endl; 
     while(fileIn >> acctNum >> acctBal >> interest >> monthlyFee >> checks) 
     { 
      cout << setw(COL_SZ) << acctNum << setw(COL_SZ) << acctBal << setw(COL_SZ) << interest << setw(COL_SZ) << 
       monthlyFee << setw(COL_SZ) << checks << endl; 
     } 
    } 
    fileIn.close(); 
    system("pause"); 
    return 0; 
} 

我拿出的ios ::出來,放在IOS ::在同樣的事情發生沒有數據和同樣的事情與ios在一起。我確實從以前的程序中創建文件...我必須將文件代碼讀入該程序嗎?

The BankAccount.txt file as a picture.

+1

不應該用ifstream :: in標誌打開輸入文件而不是out? – Juancho 2011-05-03 02:13:58

+1

+1對於酷炫的瀏覽器。 (Joking。:)) – 2011-05-03 02:45:50

+0

對於至少有一個很酷的瀏覽器得到一個點很高興T_T – Alex 2011-05-03 04:07:51

回答

1

編輯

看你輸入你不能只

while(fileIn >> acctNum >> acctBal >> monthlyFee >> checks) 

此代碼讀取這樣複雜的輸入設置閱讀下列表格格式的數據:

 
11 12.12 11.11 13.13 14.12 
11 12.12 11.11 13.13 14.12 
11 12.12 11.11 13.13 14.12 

相反,您必須先清除所需的數據才能閱讀各種字符串等。例如,要在單詞「帳戶」的跳躍,你可以讀入一個虛擬的字符串

 
Account Number#1234 
std::string dummy; 
fileIn >> dummy; // read up to the whitespace, 
        // in this case reads in the word "Account" 

然後讓你必須讀下一個字符串並提取#數量1234

std::string temp; 
fileIn >> temp; // read up to the whitespace, 
        // in this case reads in the word "Number#1234" 

但你也可以使用getline閱讀直至幷包括#

std::getline(fileIn, dummy, '#'); 

然後閱讀在#

int acctNum = 0; 
fileIn >> acctNum; 

所以,如果你輸入的是真正的格式爲你描述後的數字,你將不得不花費更多的時間搞清楚如何分析你的數據,那麼你可能預期。我不知道你的意見如何給你一個完整的答案,但上面應該有希望讓你開始。

(或者,你可以瞭解正則表達式,但在這一點上,你可能只是想學習的基礎知識。)

原始

我只是想你的代碼並具有足夠良好格式化的值在輸入中,它工作在g ++。然而,有一兩件事,我警惕的看着你的代碼是這一行:

while(fileIn >> acctNum >> acctBal >> monthlyFee >> checks) 

如果上述任何無法讀取由於文件結束過早,你COUT不會得到執行,導致沒有輸出到屏幕上。您的輸入是否具有以上所有值?他們格式良好嗎?要進行調試,我可以嘗試分解讀取:

while (fileIn) 
    { 
     fileIn >> acctNum; 
     std::cout << "Acct num is:" << acctNum << std::endl; 
     ... 
    } 

或者只是通過一個調試器。

例如,對於此輸入:

11 12.12 11.11 13.13 14.12

代碼打印出

 
Bank Account records: 
Account#BalanceInterestMonthly FeeAllowed Checks 
11 12.126.93517e-31011.1113 ` 

但隨着輸入擰緊,並添加一個隨機的非數字字符某處,即:

11 * 12.12 11.11 13.13 14.12

造成什麼得到讀取和其中來自fileIn讀取失敗我得到的只是

 
Bank Account records:  
Account#BalanceInterestMonthly FeeAllowed Checks 

所以我肯定會看片逐片,這肯定會導致你的問題。

你當然知道刪除ios::out作爲指定here

+0

是的我的文本文件看起來很漂亮....當我打開它時,會變得不穩定...我怎麼能更好地格式化它?我是否需要完美地格式化它才能夠讀取我的文件? – Alex 2011-05-03 02:24:35

+1

@Alex只要數字輸入之間有空白並且有足夠的輸入,那麼這應該起作用。但是,如果您的輸入不符合此標準,則可能會立即失敗,導致您看到您看到的內容。 – 2011-05-03 02:25:30

+0

我貼出了我正在閱讀的文件的圖片。 – Alex 2011-05-03 02:36:38

1

你有

fileIn.open("BankAccounts.txt", ios::out); 
           ^^^^^^^^ 

你打開文件進行輸出。試試ios :: in。