我正在研究一个需要在文件中存储数据的MFC应用程序
我有一个这样的类
class Client
{
public:
Client(CString Name , CString LastName , CString Id );
int create();
int update(Client & myClient);
CString name;
CString lastName;
CString id;
};
Client::Client(CString Name , CString LastName , CString Id )
{
name = Name;
lastName=LastName;
id=Id;
}
void displayMessage(CString message , CString title=L"Meesage")
{
MessageBox(NULL,message,title,MB_OK | MB_ICONERROR);
}
int Client::create(Client myClient)
{
ofstream output;
output.open("test.dat" , ios::binary );
if( output.fail() )
{
CString mess;
mess = strerror( errno );
displayMessage(mess);
return 1 ;//anything but 0
}
output.write( (char *) &myClient , sizeof(Client));
output.close();
return 0;
}
int Client::update(Client & myClient)
//also tried passing by value : int update(Client myClient)
{
ifstream input;
input.open("test.dat" , ios::binary );
if( input.fail() )
{
CString mess;
mess = strerror( errno );
displayMessage(mess);
return 1 ;//anything but 0
}
input.read( (char *) &myClient , sizeof(Client));
input.close();
return 0;
}
Create function运行良好,
但是,关于更新功能我有一些问题
我这样使用函数:
Client myClient();
myClient.update(myClient);
但是当我运行这个函数时,我得到了这个错误
Unhandled exception at 0x5adfab2a (mfc100ud.dll) in MyProject.exe: 0xC0000005: Access violation writing location 0x039708fc.
我能做什么?
小心。Client myClient();
声明了一个名为myClient
的函数。写入函数的地址会导致一些问题,比如崩溃。只需将其更改为Client myClient;
(这样您将创建一个实际的Client
对象,然后实际写入对象)。当然,我希望这样写一个Client
对象是安全的(参见Joachim Pileborg关于指针的评论,例如)。
例如,看看下面的代码:
#include <typeinfo>
#include <iostream>
struct S {};
int main()
{
S s1();
S s2;
std::cout << typeid(s1).name() << std::endl;
std::cout << typeid(s2).name() << std::endl;
}
结果(使用g++)打印出:
F1SvE
1S
重要的是它们是不一样的!s1
是一个名为s1
的函数的声明,该函数不接受任何参数,并返回一个S
。s2
是一个实际的S
对象。这被称为c++的"最令人烦恼的解析"(因为它会导致很多挫折)。
编辑:哦,男孩,你不断用更多(实际)代码更新你的问题,这不断改变事情。为了将来的参考,从完整的实际代码开始,这样人们就不必不断更改:)
你不能像那样安全地写CString
s。它们在内部存储指针,就像Joachim Pileborg提到的那样,当试图读取指针时,这会造成严重破坏。
另外,Client
不再有默认构造函数(因为您已经提供了自己的构造函数)。所以你也不能再说Client myClient;
了。您必须使用正确的构造函数
不能将CString内容存储为二进制数据。你必须使用fprintf
, CStdioFile::WriteString
或类似的东西来写数据。CString没有固定大小的缓冲区,因此address-of是无效的。
我的建议是把学习问题分成几个部分——实践CString
、file-io、类设计和UI作为不同的方面。不要把它们都混在一起,除非你对其他方面感到满意。你不知道问题出在哪里。
另外,你发布的代码是明显的错误:create
方法在类中没有任何参数,但在实现时你有一个参数!