0
#include<fstream>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<iostream>

using namespace std;
char ch;

class book
{
    char *title;
    char *author;
    double price;
    int quantity;
    public:
       book()
       {
            title=NULL;
            author=NULL;
            price=0.00;
            quantity=0;
       }
       void create(char *a, char *b, double x, int q)
       {
            title=new char;
            author=new char;
            strcpy(title, a);
            strcpy(author, b);
            price=x;
            quantity=q;
       }

       void display()
       {
           cout<<"\n"<<title<<"\t"<<author<<"\t"<<price<<"\t"<<quantity;
       }
 };

 book obj, obj2;

 fstream stock;

 void displaystock();

 void addbook()
 {
     cout << "\033[2J\033[1;1H";

     int n, i,q, j;
     stock.open("stock.txt", ios::app|ios::out|ios::binary);

     cout<<"\n\nHow many unique book titles would you like to add?";
     cin>>n;

     char *a, *b;
     double x=0;

     a=new char;
     b= new char;
     for(i=0;i<n;i++)
     {
         while ((ch = getchar()) != '\n' && ch != EOF);
         cout<<stock.tellg();

         cout<<"\n\nEnter book title: ";
         gets(a);
         cout<<"\n\nEnter author: ";
         gets(b);
         cout<<"\n\nEnter price: ";
         cin>>x;
         cout<<"\n\nEnter quantity: ";
         cin>>q;

         obj.create(a,b,x, q);
         stock.write((char*)&obj,sizeof(obj));

    }
    stock.close();
}

void displaystock()
{
    cout << "\033[2J\033[1;1H";

    stock.open("stock.txt", ios::in|ios::binary);
    cout<<stock.tellg();

    while(stock.read((char*)&obj2, sizeof(obj2)))       
    {   

        cout<<"\n"<<stock.tellg();

        //if(!stock.eof())
        {
            obj2.display();
        }
        //else
            //break;
    }

    stock.close();
}


int main()
{
    addbook();    
    displaystock();    
    return 0;
}

これは、クラスのオブジェクトを使用してバイナリ ファイルに読み書きしようとするコードです。ファイルが存在しない場合 (初回実行時)、動作します。しかし、何かが既存のファイルに追加されるとすぐに、読み取り中に (displaystock 関数で) セグメンテーション違反が発生します。

4

1 に答える 1

0

あなたのコードには多くの問題があります。ここで一つ指摘しておきたいのは、

 void create(char *a, char *b, double x, int q)
 {
     title=new char;
     author=new char;
     strcpy(title, a);
     strcpy(author, b);
     price=x;
     quantity=q;
}

titleandauthorを型であると宣言しchar*ており、それらを使用して入力引数 a および b からデータをコピーしています。次の例では、1 文字にのみメモリを割り当てています。

 title = new char;

明らかな場合は、strcpy を実行するときにそれを配列として扱うつもりです。その結果、データをコピーするのに十分なスペースを提供していないため、割り当てていないメモリに書き込む可能性が高くなります。これを使用する方が本当に良いでしょうstd::string。また、コード内には多くのグローバル変数が散らばっています。また

  stock.write((char*)&obj,sizeof(obj));

よくない。bookクラスのインスタンスのアドレスを にキャストすることは本当に意味がありますchar*か? コードをより単純な部分に分割し、非常に多くのグローバル変数を使用するのをやめ (代わりに関数引数を使用して物事を渡すことを検討してください)、デバッガーでコードをステップ実行して特定の問題を特定しようとします。うまくいけば、これはあなたが抱えている問題のいくつかを特定して修正するのに役立ちます.

最後のポイント - で割り当てたメモリの削除に失敗していますnew

于 2012-07-11T19:16:58.083 に答える