2015-07-20 115 views
0

我有写一个字符串与ofstream的 二进制文件但是,当我阅读fstream的 相同的二进制文件,它出现访问冲突读取位置误差 我看了一些文章,但我仍然可以“T设法解决我的错误C++访问冲突读取位置fstream的阅读

void activity::creAc(){ 
cout << "Activity ID : " << endl; 
cin >> id; 
cout << "Activity Title : " << endl; 
cin >> title; 
cout << "Activity Type : " << endl; 
cin >> type; 
cout << "Activity Date : " << endl; 
cin >> acdate; 
cout << "Activity Duration : " <<endl; 
cin >> duration; 
cout << "Activity Fees : " << endl; 
cin >> fee; 

} 

void activity::showTask(){ 
cout << "Activity Title : " << title<<endl; 
cout << "Activity Type : " << type << endl; 
cout << "Activity Date : " << acdate << endl; 
cout << "Activity Duration : " << duration << endl; 
cout << "Activity Fees : " << fee << endl; 

} 

#include <iostream> 
#include <string> 
#include "user.h" 
#include "Teacher.h" 
#include "staff.h" 
#include "activity.h" 
#include <fstream> 
#include <istream> 
#include <ostream> 
using namespace std; 

void main(){ 
    cout << "1.Create" << endl; 
    cout << "2.Read" << endl; 
    int choicenum; 
    cin >> choicenum; 
    switch (choicenum){ 
    case 1: { 
       activity obj; 
       ofstream fp2; 
       fp2.open("activity.dat", ios::binary | ios::app); 
       obj.creAc(); 
       fp2.write((char*)&obj, sizeof(obj)); 
       fp2.close(); 
       break; 
    } 
    case 2: 
    { 
     activity obj2; 
     ifstream fp1; 
     fp1.open("activity.dat", ios::binary); 
     while (fp1.read((char*)&obj2, sizeof(obj2))){ 
       obj2.showTask(); 
     } 
     fp1.close(); 
    } 
    default: exit(0); 
    }; 

    system("pause"); 
} 
+2

如果'activity'包含任何非平凡成员,如'std :: string',则不能使用二进制读取或写入。 –

回答

0

std::string与许多容器一样,实际上是一个智能指针的包装,它指向根据需要动态分配的某些数据。

其写入文件将只存储当时的地址写入文件(加上支持像长度数据等)

因此,当你读回该文件,你从一个指针不同的会话/机器等。然后尝试读取指向的位置,它根本不属于您的程序,因此存在违规。

您需要静态分配已知长度的char,而不是任何需要指针的东西。

-1

坏声明

class activity { 
    // data member is std::string. 
    typedef std::string value_type; 
    value_type id; 
    value_type title; 
    value_type type; 
    value_type acdate; 
    value_type duration; 
    value_type fee; 
public: 
    void creAc(); 
    void showTask(); 
}; 

好的声明

class activity { 
    // data member is char[64]. 
    typedef char value_type[64]; 
    value_type id; 
    value_type title; 
    value_type type; 
    value_type acdate; 
    value_type duration; 
    value_type fee; 
public: 
    void creAc(); 
    void showTask(); 
}; 

您应该了解C++类的内存布局。

+1

也许你应该解释为什么你的解决方案更适合二进制读/写,有什么缺点 – KABoissonneault