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;
}

您正在声明titleauthor成为类型char*,并且您正在使用它们从输入参数 a 和 b 复制数据。您仅在以下内容中为 1 个字符分配内存

 title = new char;

很明显,您打算在 strcpy 时将其视为数组。结果将是您很可能正在写入尚未分配的内存,因为您没有提供足够的空间来复制数据。你真的会更好地使用std::string这个。此外,您的代码中散布着许多全局变量。还

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

不好。book将类实例的地址转换为a真的有意义char*吗?我会将您的代码分解成更简单的部分,停止使用如此多的全局变量(考虑使用函数参数来传递东西)并尝试通过使用调试器逐步检查您的代码来识别特定问题。希望这将帮助您识别和解决您遇到的一些问题。

最后一点 - 您没有删除您分配的任何内存new

于 2012-07-11T19:16:58.083 回答