0

我编写了一个名为 DCstring 的 C++ 类,类似于 Java 中的 String 类。

class DCstring
{

public:
     TCHAR  *string;
     DCstring();
     DCstring(TCHAR * str);
          DCstring in();
}
DCstring::DCstring()
{
    string=NULL;

}
//constructor to initialize
DCstring::DCstring(TCHAR* temp)
{
    _TINT i=0;
    string=(TCHAR*)malloc(_tcslen(temp)*sizeof(TCHAR)+1);
    for(;i<_tcslen(temp);i++)
        string[i]=temp[i];
    string[i]=0;
}
//to get input from user
DCstring DCstring::in()
{
    wprintf(L"\n Enter the string :");
    TCHAR arr[200],*s;
    _getts(arr);
    _TINT i=0;
    string=(TCHAR*)realloc(string,_tcslen(arr)*sizeof(TCHAR)+1);
    for(;i<_tcslen(arr);i++)
        string[i]=arr[i];
    string[i]=0;
    return(*this);
}

这工作正常。我在结构中使用这个 DCstring 变量,并使用 fwrite 和 fread 函数将该结构对象读取和写入文件中。

typedef struct Stud
{
    DCstring name;
}stud;

void InsertToFile(stud *temp,FILE *file)
{
    (temp->name)=DCstring();
    fflush(stdin);
    temp->name=(temp->name).in();
        fseek(file,0,SEEK_END);
    fwrite(&(*head),sizeof(stud),1,file);
}

void Show(stud *temp,FILE *file)
{
        rewind (file ) ;
        fread ( &temp,sizeof(stud), 1, file ) ;
        wprintf ( L"\n%s",temp->name ) ;
}

此代码可以第一次读取和写入数据。当我重新执行代码并调用Show(stud *temp,FILE *file)函数时,它会引发运行时错误/异常。

"Unhandled exception at 0x77c815de in StudentRecord.exe: 0xC0000005: Access violation reading location 0x002850a8".

似乎是内存问题。帮帮我。

4

2 回答 2

2

除了你的DCString类的糟糕实现(暴露的实例变量、缺少析构函数、固定大小的输入缓冲区等等)之外,你没有理解写一个你的实例struct stud实际上不会写指向的数据stud.name.string

struct stud包含一个实例,DCString但是用于存储字符串数据的内存位于堆上(您使用 分配malloc());您的代码正在写入指向已分配内存的指针,当您重新读取它时(当然是在不同的会话中),这将毫无意义。

您需要提供一个读/写DCString方法,该方法通过一个FILE *(最好使用istreamand ostream,假设这是 C++)读取/写入字符串内容,在读取期间分配新内存。

于 2013-07-08T09:05:21.833 回答
1

问题在这里:

public:
    TCHAR  *string;

这会写出一个指向字符串的指针,因此当您回读时,您会得到一个不指向任何数据的指针,因此您的访问冲突。例如,这个问题讨论了您可能想要做的序列化。

此外:

fflush(stdin);

是未定义的行为。

此外,您应该真正使用 C++std::stringstd::i/ofstream.

编辑我刚刚注意到:

wprintf ( L"\n%s %d %c",temp->name ) ;

您没有任何与%dand%c参数匹配的东西。

于 2013-07-08T08:57:05.453 回答