#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函数中)。
答案 0 :(得分: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;
}
您声明title
和author
属于char*
类型,并且您正在使用它们来复制输入参数a和b中的数据。您只在以下
title = new char;
很明显,当你strcpy时,你打算把它当作一个数组。结果将是您极有可能写入尚未分配的内存,因为您没有提供足够的空间来复制数据。你真的会更好地使用std::string
。此外,您的代码中还有许多全局变量。还
stock.write((char*)&obj,sizeof(obj));
不好。将类book
的实例的地址强制转换为char*
是否真的有意义?我会将代码分解为更简单的部分,停止使用这么多全局变量(考虑使用函数参数传递信息)并尝试通过使用调试器逐步执行代码来识别特定问题。希望这有助于您识别和解决您遇到的一些问题。
最后一点 - 您无法删除使用new
分配的任何内存。