-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. 首选每行一个变量定义。使开发和维护更容易。构建时间的成本可以忽略不计。
  4. 更喜欢在构造函数中使用初始化列表,例如: balance(0.0), //...
  5. 在你的return陈述中保持一致。不需要括号。
  6. 需要有光标定位吗?这是 Windows 中的一个难题。
  7. C++ 默认 I/O 流可能与 Windows 控制台定位不兼容。
  8. 您没有存储记录。最后一次迭代总是会覆盖之前的记录。
  9. 为什么需要从 中返回操作员的响应get_data
  10. 绝对摆脱光标定位。它阻碍了你的发展。如有必要,在您的程序正常运行且健壮后将其重新添加。
  11. 您不给操作员机会更正选择并重试。 不好
  12. 最好不要使用二进制 I/O,尤其是在将结构和类写入文件时。如果类或结构布局发生更改,或者编译器在字段之间插入填充,则可能无法正确分配您的读数。此外,验证文件中的数据将更加困难。我建议每条记录使用一个文本行,每个字段用制表符、逗号或其他分隔符分隔。这允许您将数据导入其他应用程序(例如电子表格)以进行验证。文本比二进制数据更容易验证。
  13. 更喜欢在你的类/对象中有 I/O 方法。这样你就可以做出一个简单的陈述,比如file << my_budget;
  14. 如果您不使用 x,y 定位,则可以将菜单声明为一个常量文本文字并输出(更容易和更快),而不是一次显示一行。更容易修改和维护。
  15. main函数int总是返回。return EXIT_SUCCESS;必要时使用。
  16. 在您的方法中,budget变量是本地的,并且会在从方法返回时消失。而是引用类变量。
  17. 始终检查 I/O 错误。这可能是您的问题所在。
  18. 在清除之前暂停控制台。尝试这个: cin.ignore(100000, "\n");
于 2012-07-27T19:44:10.847 回答