从文件读取数据



我正在研究一个需要在文件中存储数据的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的函数的声明,该函数不接受任何参数,并返回一个Ss2是一个实际的S对象。这被称为c++的"最令人烦恼的解析"(因为它会导致很多挫折)。

编辑:哦,男孩,你不断用更多(实际)代码更新你的问题,这不断改变事情。为了将来的参考,从完整的实际代码开始,这样人们就不必不断更改:)

你不能像那样安全地写CString s。它们在内部存储指针,就像Joachim Pileborg提到的那样,当试图读取指针时,这会造成严重破坏。

另外,Client不再有默认构造函数(因为您已经提供了自己的构造函数)。所以你也不能再说Client myClient;了。您必须使用正确的构造函数

不能将CString内容存储为二进制数据。你必须使用fprintf, CStdioFile::WriteString或类似的东西来写数据。CString没有固定大小的缓冲区,因此address-of是无效的。

我的建议是把学习问题分成几个部分——实践CString、file-io、类设计和UI作为不同的方面。不要把它们都混在一起,除非你对其他方面感到满意。你不知道问题出在哪里。

另外,你发布的代码是明显的错误:create方法在类中没有任何参数,但在实现时你有一个参数!

相关内容

  • 没有找到相关文章

最新更新