-3
error snapshot : https://rapidshare.com/files/3201989698/Capture5.JPG

code :



#include<fstream>
#include<conio.h>
#include<Windows.h>
#include<iostream>

using namespace std;
int ch_m;

HANDLE hConsole;

class budget
{
public :
    float balance;

    string due_name,loan_name;
    int  year,month;
    float due_pay,loan_given;//due_pay due to be paid 


    budget()
    {
        balance=0;
        month=1;
        due_name="NO BODY";
        loan_name="SAFE";
        year=0;            
        balance = 0;
        due_pay=0;
        loan_given=0;

    }
    char get_data();
    void show_data();
    void budget_menu();
    void balance_menu();

    int yr()
    {
        return(year);

    }

    int mont()
    {
        return month;
    }




};

void gotoxy(int x,int y)
{
    HANDLE hConsoleOutput;
    COORD dwCursorPosition;
    cout.flush();
    dwCursorPosition.X=x;
    dwCursorPosition.Y=y;
    hConsoleOutput=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition
    (hConsoleOutput,dwCursorPosition);
}

char budget :: get_data()
{
  char ch_b;
    gotoxy(5,2);
    cout<<"Enter Month                                                           :";
    cin>>month;
    gotoxy(5,4);
    cout<<"Enter year                                                            :";
    cin>>year;
    gotoxy(5,6);
    cout<<"Enter your balance for the current month and year in Rs               :"; 
    cin>>balance;
     do
       {
           gotoxy(6,9);
           cout<<"Continue adding records?(y/n)\n";
           cin>>ch_b;
       }while(tolower(ch_b)!='n'&&tolower(ch_b)!='y');


       return ch_b;


}



void budget :: show_data()
{

    gotoxy(5,2);
    cout<<"Month                                                           :"<<month;
    gotoxy(5,4);
    cout<<"Year                                                            :"<<year;

    gotoxy(5,6);
    cout<<"Your balance for the current month and year in RS               :"<<balance; 

  _getch();
}


void budget:: budget_menu()
{



    system("cls");
    gotoxy(12,5);



    cout<<"---------------------------------------";
    gotoxy(12,6);
    cout<<"Budget Menu";
    gotoxy(12,7);
    cout<<"---------------------------------------";
    gotoxy(12,10);  
    cout<<"1) Balance";
    gotoxy(12,12);
    cout<<"2) Loan Given";
    gotoxy(12,14);
    cout<<"3) Due to be paid";
    gotoxy(12,16);
    cout<<"4) Exit";

   gotoxy(14,17);
    cout<<"Enter your choice\n";
    cin>>ch_m;


    switch(ch_m)
    {
    case 1:  
        balance_menu();
        break;
    default:
        system("cls");
        gotoxy(15,8);
        cout<<"Wrong Input!!";

    }




}


void write_balance()
 {
system("cls");
 budget b;
 ofstream f1;
 f1.open("balance.dat",ios::app|ios::binary);
 char ch;
 do{
        ch = b.get_data();
        f1.write((char*)&b,sizeof(b));
   }while(tolower(ch)=='y');

 f1.close();


 }



 void read_balance()                //PROBLEM AFTER ENTERING THIS FUNCTION
     {
         system("cls");
       budget b;
    ifstream f1;
    f1.open("balance.dat",ios::in|ios::binary);
    while(f1.read((char*)&b,sizeof(b)))
    { b.show_data();
     }

   system("cls");
       cout<<"No More Records To Display!!";
    getch();
    f1.close();

     }



void budget :: balance_menu()
{
    int ch_bm;//balance menu choice

    char coni;//continue?
    system("cls");
    gotoxy(12,6);
    cout<<"1) Add current month and year balance";
    gotoxy(12,7);
    cout<<"2) Modify a balance";
    gotoxy(12,8);
    cout<<"3) Search a balance";
    gotoxy(12,9);
    cout<<"4)Delete a Record";
    gotoxy(12,10);
    cout<<"5) Display all records";
    gotoxy(12,11);
    cout<<"6) Back to previous menu";
    gotoxy(12,12);
    cout<<"7) Exit";
    gotoxy(14,15);
    cout<<"Enter your choice\n";
    cin>>ch_bm;
    switch(ch_bm)
    {
    case 1 :write_balance();
        break;
    case 5:
        read_balance();
        break;
    default :
        system("cls");
        gotoxy(15,8);
        cout<<"Wrong Input!!";
    }

    if(ch_bm!=6)
    {
        system("cls");
        gotoxy(15,8);
        cout<<"Continue?";
        cin>>coni;
    if(tolower(coni)=='y')
     {
        balance_menu();
     }
    }

getch();
}








void main()

{

    system("cls");

    budget b;
    b.budget_menu();


    _getch();
}

最初にオプション 1/1 に移動してファイルを作成し、次に 1/5 に移動してコンテンツを読み取ります。ここでブレーク ポイント エラーが発生します。これまでは、読み取りと書き込みのオプションのみが含まれていました。

3週間経ちました..私はここで立ち往生しています

私は多くのことを試しました

私のコードは Turbo C++ では正常に動作しますが、vc++ では動作しません。このコードは予算のデータを保持するためのものです。問題のある関数は、コメントを使用して強調表示されます。

4

1 に答える 1

1

ここに私のレビューがあります:

  1. より小さな変数サイズが必要な場合を除き、使用しdoubleないでください。float
  2. 0.0浮動小数点数に割り当てます。浮動小数点の場合は「F」を追加します。
  3. 1 行に 1 つの変数定義を優先します。開発と保守が容易になります。ビルド時間のコストはごくわずかです。
  4. 次のようなコンストラクターで初期化リストを使用することを好む: balance(0.0), //...
  5. return発言には一貫性を持たせてください。括弧は必要ありません。
  6. カーソルの位置を設定する必要がありますか? Windows では難しい問題です。
  7. C++ の既定の I/O ストリームは、Windows コンソールの配置と互換性がない場合があります。
  8. レコードを保存していません。最後の反復は常に前のレコードを上書きします。
  9. からオペレータの応答を返す必要があるのはなぜget_dataですか?
  10. 間違いなくカーソルの位置を取り除きます。それはあなたの発達の邪魔になっています。プログラムが正しく動作し、堅牢になったら、必要に応じて追加してください。
  11. オペレーターに選択を修正して再試行する機会を与えません。 良くない
  12. 特に構造体やクラスをファイルに書き込む場合は、バイナリ I/O を使用しないことをお勧めします。クラスまたは構造のレイアウトが変更された場合、またはコンパイラがフィールド間にパディングを挿入した場合、読み値が正しく割り当てられない可能性があります。また、ファイル内のデータがより困難になることを確認してください。レコードごとに 1 つのテキスト行を使用し、各フィールドをタブ、コンマ、またはその他の区切り記号で区切ることをお勧めします。これにより、検証のためにスプレッドシートなどの他のアプリケーションにデータをインポートできます。テキストは、バイナリ データよりも検証がはるかに簡単です。
  13. クラス/オブジェクトに I/O メソッドを含めることをお勧めします。そうすれば、次のような簡単なステートメントを作成できますfile << my_budget;
  14. x,y 配置を使用しない場合は、メニューを 1 つの定数テキスト リテラルとして宣言し、一度に 1 行ずつ表示するよりも (はるかに簡単かつ迅速に) 出力できます。変更や保守も容易です。
  15. このmain関数はint、常に を返します。return EXIT_SUCCESS;必要に応じて使用してください。
  16. メソッドでは、budget変数はローカルであり、メソッドから戻ると消えます。代わりにクラス変数を参照してください。
  17. 常に I/O エラーをチェックしてください。これが問題の場所である可能性があります。
  18. コンソールをクリアする前に一時停止します。これを試して: cin.ignore(100000, "\n");
于 2012-07-27T19:44:10.847 に答える