0
class Student 
{
public:
Student *prev;  
char S_Name[15];
char F_Name[15];
int Reg_Num;
char Section;
char MAoI[15];
float CGPA;
Student *next;
} 

上記のクラスがあり、プログラムを終了するときにリンクリストのバイナリファイルにデータを書き込み、プログラムの実行時に再度読み込んでリンクリストを作成したいと考えています。試してみましたが、何度か失敗しました。

データを入力するためのコード `Student * Add_Entry() { Student *temp=new Student();

char s_Name[15];
char f_Name[15];
int reg_Num;
char section;
char mAoI[15];
float cGPA;

cout <<"**********************Menu***************************\n ";
cout<<"\nEnter the Studets name \"";
cin>>s_Name;

cout<<"\nEnter Father`s name \"";
cin>>f_Name;

cout<<"\nEnter the Registration Number \"";
cin>>reg_Num;

cout<<"\nEnter the Section \"";
cin>>section;

cout<<"\nEnter the Major Area of Interest \"";
cin>>mAoI;

cout<<"\nEnter the Current CGPA \"";
cin>>cGPA;

strcpy_s(temp->S_Name,s_Name);
strcpy_s(temp->F_Name,f_Name);
temp->Reg_Num=reg_Num;
temp->Section=section;
strcpy_s(temp->MAoI,mAoI);
temp->CGPA=cGPA;
temp->next=NULL;
temp->prev=NULL;
return temp;

//temp=Create_node(s_Name,f_Name,reg_Num,section,mAoI,cGPA);    

}`

ファイルから読み取るには、 ` char *buffer; を使用します。

    ifstream reader;
    reader.open("student.bin",ios::in | ios::binary);
    if(reader.is_open)
    {
        do
        {
            reader.read(buffer,ch);
            if(Header==NULL)
            {
                Header=(Student)*buffer;
                temporary=Header;
            }

            else
            {
                temporary->next=(Student)*buffer;
                temporary=temporary->next;
            }
        }while(buffer!=NULL);
    }

`

そして、書くには `temporary=Header; を使います。//ストリーム ライターのエントリをバックアップします。writer.open("学生.bin",ios::out | ios::binary);

                while(temporary!=NULL)
                {   
                    writer.write((char)* temporary,sizeof(temporary));
                    temporary=temporary->next;
                }

                writer.close();

`

4

1 に答える 1

0

この行:

Header=(Student)*buffer;

手段: おそらく char へのポインターである buffer を取得し、それを逆参照して、char. 次に、それを にキャストしcharますStudentcharコンパイラは、 aを aに変換する方法を知りませんStudent

代わりにこれを行う場合:

Header= *((Student *)buffer);

ポインターを適切な型のポインターにキャストし、逆参照してコピー可能な構造体を提供します。

あなたはそれをいたるところでやっています。

また、読むときは、最後の項目の「次へ」のポインタも「前の」ポインタも記入しません。最後に保存されたアイテムの「次の」ポインターはゼロかもしれませんが (正しく保存されたと仮定して)、前のポインターは何を指してもかまいません。ベスト プラクティスは、すべてを正しく初期化することです。

また:

if(reader.is_open)

次のようにする必要があります。

if(reader.is_open())
于 2012-12-17T15:20:14.217 に答える