2012-08-08 75 views
0

這裏是我的主要的一些部分:從文本文件輸入,顯示不正確,爲什麼?

int main() { 
    Inventory Master; 
    bool flag; 

    Customer Bob("Bob", "CreditCard.txt"); 
    Customer Chris("Chris", "CreditCard.txt"); 
} 

這裏是我的方法:

Customer::Customer(string n, string fileName) { 
    name = n; 
    ifstream Credit; 

    Credit.open(fileName.c_str(), ios::in); 

    while(Credit.good() && !Credit.eof()) { 
    Credit >> card >> balance >> ws; 
    cout << card <<"\t" << balance << endl; 

    } 


CreditCard _CC(int card, double balance); 
} 

這裏是我的「CreditCard.txt文件:

12345 15.00 
32564 20.00 

我想要的方式要顯示的信息有分配給Bob的第一行「12345 15.00」和分配給Chris的第2行,並且如果我創建新客戶的新實例或對象,就這樣做等等。目前實施它是繼續分配「12345 15.00和32564 20.00」給鮑勃和克里斯。如果有人能夠告訴我如何指示文本文件的某些行,以便鮑勃被分配到第1行,克里斯到第2行,並且當我將其添加到文本文件中時,更多的客戶到其他行,我可以感謝幫助。

+0

嘗試逐字讀取文件,直到找到特殊字符,然後停止閱讀。將這些字符分配給一個變量,然後將變量分配給Bob或Chris。您可以使用<或|管他呢。此外,不要忘記關閉文件;) – 2012-08-08 22:45:51

+0

嗯好吧,我看到它背後的想法。但是,你能否稍微向我展示一個例子,因爲我已經將文本輸入到卡片和平衡中了。我怎麼能把它們分配給字符。我對這一點還很陌生,非常瞭解。 – tensuka 2012-08-08 22:51:58

+0

我在下面的答案中添加了一個例子。檢查一下,它應該定義工作,但你必須在第一行成功讀取後退出。 – 2012-08-08 22:58:06

回答

0

一切都發生在構造函數中。因此,如您所寫,您的代碼表示:雖然流處於良好狀態,而不是文件結尾(關鍵點),請寫入此處。

好吧,如果你仔細考慮一下,直到文件末尾達到Customer的每個實例爲止。這不是你想要的。我可能會建議將該名稱添加爲每條記錄的數據文件中的第一個字段。然後,您可以在文件中搜索正確的記錄,假設您確保所有名稱都是唯一定義的,然後按字符串將數據拉出。這樣它不會每次都從頭到尾閱讀。我添加了「鮑勃」作爲第一行的第一個字段,「克里斯」添加到第2行,並製作了string name = "Chris";。所以......

#include <string> 
#include <iostream> 
#include <fstream> 
using namespace std; 
int main() 
{ 
    string tempStr; 
    string name = "Chris"; 
    ifstream Credit; 

    Credit.open("Info.txt", ios::in); 

    while(Credit.good() && !Credit.eof()) 
    { 
     getline(Credit, tempStr, ' ');//Reads the first records name field 
     cout << tempStr << endl; 
     if(name.compare(tempStr) == 0)//Compares the "name" to the field. 
     {       //If true they are the same 
      //Proceed to do reading and assignments with additional getline statements 
      cout << "Chris was matched the second time around!"; 
      Credit.setstate(ios::eofbit, true);//***Sets eof to true 
     } 
     else 
     { 
      Credit.ignore(50, '\n'); 
      //That should put Credit in the proper position to read the next name 
     } 
    } 

}

你這樣做會導致問題的方式。如果你知道記錄在文件中的位置,唯一可行的方法是。如果你有五條記錄呢?當你到達第三個時,你將不得不ignore,或類似的,在你正在工作之前的所有領域。此外,人們可以很方便地從數據文件中讀取打印。爲每條記錄提供標籤(名稱)的另一個原因。另外,你顯然是using namespace std;,所以我也這樣做了,但是它被折磨了。

+0

@Aj Munot:如果事實證明這是最有用的答案;表現出對投票的熱愛,甚至更好地接受它。我的代表可以使用它! – ChiefTwoPencils 2012-08-09 03:15:16

+0

哈哈沒問題,但我能夠弄清楚如何做到這一點之前,我看到這anwser沒有使用任何人的建議在這裏給出。我仍然感謝你的幫助和反饋,所以我會爲你投票,因爲它是最豐富的,我從你的例子中學到了一些東西。 – tensuka 2012-08-09 03:34:16

0

istream.getline()http://www.cplusplus.com/reference/iostream/istream/getline/可能是你的答案。一次只讀一行。

一點點在這裏例如: http://www.cplusplus.com/forum/beginner/27799/

從我的舊homerworks的一個小例子:你在做鮑勃和克里斯

ifstream fin(fileName); 
char buffer[256]; 

int count = 0; 

if (fin.is_open()) 
{ 
    while (!fin.eof()) 
    { 
     fin.getline(buffer, 256); 
    } 
} 
+0

或者,使用字符串的自由函數getline()可能更易於使用。 HTTP:// WWW。cplusplus.com/reference/string/getline/ – jwismar 2012-08-08 22:59:04

+0

你是對的。這是一個古老的家庭作業,所以我們的老師總是希望我們使用字符數組而不是字符串呵呵。 – 2012-08-08 23:02:23

相關問題