2014-01-15 180 views
-1

嗨我正在一個簡單的工資申請。以下代碼包含使用switch語句的兩個選項菜單。該代碼還鏈接到名爲「shop-account」的文本文件。該文件僅包含值100.使用功能讀取/寫入文件

對於選項1,用戶應該能夠從文件中轉移金額。用戶應該能夠進行儘可能多的轉帳,而不用透支帳戶。代碼應該能夠輸出當前餘額。我相信我假設要使用void函數,但我以前從未使用它,並且真的很掙扎。我希望有人可以看看代碼,並告訴我哪裏出錯了。謝謝

int read_balance (void); 
void write_balance (int balance); 

using namespace std; 
int _tmain(int argc, _TCHAR* argv[]) 
{ 

    int selection; 
    int total; 
    int balance; 
    int NewAmount; 

    do { 
      cout << "1. Transfer an amount" <<endl; 
      cout << "2. Quit" << endl; 
      cout << "Please enter menu number"<<endl; 
      cin >> selection; 

      switch(selection) 
      { 
       case 1: 
        cout << "You have choosen to transfer an amount" << endl; 
        cout << "How much do you wish to transfer from the shop account?"<<endl; 
        cin >> NewAmount; 
        balance -= NewAmount; 
        write_balance (balance); 
        cout << balance << endl; 
        break; 

       case 2: 
       return 0; 
       break; 

       default: 
       cout << "Ooops, invalid selection!" << endl; 
       break; 
       } 

     }while(selection != 2); 

    system("pause"); 
    return 0; 
} 


int read_balance (void) 
{ 
    fstream f; 
    f.open("shop-account.txt"); 
    f >> balance; //error: "balance" is unidentified 
    f.close(); 
    return balance; 
} 


void write_balance (int balance) 
{ 
    fstream f; 
    f.open("shop-account.txt"); 
    f << balance; 
    f.close(); 
} 
+0

我希望你能看看代碼,並告訴我們你認爲你出錯的地方。由於 –

+0

也是唯一一塊代碼,我正在尋找幫助是如何從文件中實際轉移一筆金額,一旦我找到了這一點,我會繼續嘗試,並自己做其餘的 – user3057816

+2

缺少縮進和它不是一個事實可編輯的例子帳戶爲「你要去哪裏錯」? - 在你的'read_balance'裏,'balance'在哪裏?沒有地方。將'int balance;'添加到函數中。 – ShinTakezou

回答

1

你的功能沒有平衡變量聲明!你必須在你的函數中添加一個平衡的聲明

int read_balance(void) 
{ 
    fstream f; 
    f.open("shop-account.txt"); 

    int balance; 
    f >> balance; //now it's defined 
    f.close(); 
    return balance; 
} 
+0

這隻能解答一半的問題。假設OP想要一個程序...... _makes sense_ – sehe

+1

一些流錯誤檢查會很好 – zoska

+4

@zoska:你不覺得這太多了嗎? –

3
  1. 與其他人一樣提到的,你沒有申報在正確的範圍內int balance(函數級別範圍,在這種情況下)。

    事實上,它看起來像你忘記打電話read_balance產品總數,讓您的balance計算中使用的不確定的值,這是Undefined Behaviour

  2. 接下來:在你使用變量的地方聲明你的變量,這樣當你決定將代碼片段提取到子函數中時,可以防止這種情況發生,並且可以更容易地看到變量的使用位置。因此,更容易看到代碼是否正確。

  3. Next:錯誤處理。如果你沒有,你的程序是毫無價值的。事實上,固定上述問題,即使,

    • 只需輸入無效輸入一次會運行一個循環,並只保留從其減去從賬戶餘額不定值和寫作這些錯誤的價值觀到磁盤。這可能不是你想要的。

    • 使得shop-account.txt只讀足以節目愚弄到

      • 傳輸無限量的,而無需更新具有文件中平衡的錯誤觀念文件
      • (因爲它從來沒有檢查)

這裏是一個清理的版本,進行最低限度的檢查,並添加一個選項來「檢查帳戶餘額」。似乎很有用。

看到它Live On Coliru

我希望一些這有助於。首先,我希望你的老師會提到大部分內容:/

int read_balance(void); 
void write_balance(int balance); 

#include <iostream> 
#include <limits> 

int main() 
{ 
    while(std::cin.good()) 
    { 
     std::cout << "0. Request balance"  << std::endl; 
     std::cout << "1. Transfer an amount" << std::endl; 
     std::cout << "2. Quit"     << std::endl; 
     std::cout << "Please enter menu number" << std::endl; 

     int selection = 2; 
     if(std::cin >> selection) 
     { 
      std::cout << "DEBUG: selection:" << selection << "\n"; 
      switch(selection) 
      { 
      case 0: 
       std::cout << "The current account balance is " << read_balance() << std::endl; 
       break; 

      case 1: 
       { 
        std::cout << "You have choosen to transfer an amount" << std::endl; 
        std::cout << "How much do you wish to transfer from the shop account?"<<std::endl; 

        int amount = 0; 
        if (std::cin >> amount) 
        { 
         std::cout << "DEBUG: amount:" << amount << "\n"; 
         int balance = read_balance(); 
         if(amount<=0) 
         { 
          std::cout << "Amount must be positive\n"; 
         } 
         else if(balance < amount) 
         { 
          std::cout << "Insufficient funds\n"; 
         } 
         else 
         { 
          int new_balance = balance - amount; 
          write_balance(new_balance); 
          std::cout << "New account balance: " << new_balance << std::endl; 
         } 
        } else 
        { 
         // bad input cleared outside the switch 
        } 
       } 
       break; 

      case 2: 
       return 0; 
       break; 

      default: 
       std::cout << "Ooops, invalid selection!" << std::endl; 
       break; 
      } 
     } 

     if(std::cin.eof()) 
     { 
      std::cout << "Bye\n"; 
      return 0; 
     } 
     if(std::cin.fail()) 
     { 
      std::cin.clear(); 
      std::cin.ignore(99999, '\n'); 
      std::cout << "Invalid input\n"; 
      // note eof() can be true here 
     } 
    } 
} 

#include <fstream> 

int read_balance(void) 
{ 
    std::ifstream f; 
    f.exceptions(std::ios::failbit | std::ios::badbit); 
    f.open("shop-account.txt"); 
    int balance; 
    f >> balance; 
    f.close(); 
    return balance; 
} 

void write_balance(int balance) 
{ 
    std::ofstream f; 
    f.exceptions(std::ios::failbit | std::ios::badbit); 
    f.open("shop-account.txt"); 
    f << balance; 
    f.close(); 
} 
+0

你不覺得這太過分嗎? OP顯然不知道編程,因爲他甚至不能正確地初始化函數中的變量。現在你正在向他拋出異常。而這個「之前忽略:」 - 這是很不清楚你的意圖是在這裏(我知道,你知道,但會開始程序員知道嗎?) – zoska

+0

@zoska你不覺得你的評論有點可笑嗎?他們正在學習編程。在C++中。當然,你告訴他們如何使用C++。編程。 (當然,除去那些調試遺留物,正如你所看到的,我傾向於很好地測試我的答案:) :) – sehe

+1

@zoska:多少太多了?你想提供廢話代碼只是因爲有人沒有看到好的代碼?當你認爲他們應該開始看到好的代碼,那麼? –