0

Java の String クラスに似た DCstring という名前の C++ クラスを作成しました。

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())。あなたのコードは、割り当てられたメモリへのポインタを書き込んでいます。これは、(確かに別のセッションで)読み返すと意味がありません。

文字列の内容を読み取り/書き込みし、読み取り中に新しいメモリを割り当てる a (C++ の場合はandを使用する方がよい) にDCString渡される読み取り/書き込みメソッドを提供する必要があります。FILE *istreamostream

于 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 ) ;

%dおよび%cパラメータに一致するものはありません。

于 2013-07-08T08:57:05.453 に答える