ios :: app导致问题

时间:2012-07-11 18:57:49

标签: c++ file binary

#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函数中)。

1 个答案:

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

您声明titleauthor属于char*类型,并且您正在使用它们来复制输入参数a和b中的数据。您只在以下

中为1个字符分配内存
 title = new char;

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

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

不好。将类book的实例的地址强制转换为char*是否真的有意义?我会将代码分解为更简单的部分,停止使用这么多全局变量(考虑使用函数参数传递信息)并尝试通过使用调试器逐步执行代码来识别特定问题。希望这有助于您识别和解决您遇到的一些问题。

最后一点 - 您无法删除使用new分配的任何内存。