2012-02-08 11 views
-1

次のコードは、テキストモードで扱うデータファイルを示しています。型キャストエラー++

#include "stdafx.h" 
#include "fstream" 
#include "conio.h" 
#include "string" 
#include "iostream" 

using namespace std; 

int count = 0; 

class student 
{ 
    char name[50], grade; 
    float mks; 
public: 
    student() 
    { 
     mks = 0; 
    } 
    void getdata(); 
    void putdata(); 
    void moddata(); 
}; 
void student :: getdata() 
{ 
    cout << "Enter data for record number: " << "(++count)" << ": "; 
    cout << "\nEnter name of the student: "; 
    cin >> name; 
    cout << "\nEnter marks: "; 
    cin >> mks; 
    cout << "\nEnter grade: "; 
    cin >> grade; 
    _getch(); 
} 
void student :: putdata() 
{ 
    cout << "\nDisplaying data of required record: "; 
    cout << "\nName: " << name << "\nMarks: " << mks << "\nGrade: " << grade; 
    _getch(); 
} 
void student :: moddata() 
{ 
    cout << "Enter correct details:-" << endl; 
    cout << "Enter name: "; 
    cin >> name; 
    cout << "\nEnter marks: "; 
    cin >> mks; 
    cout << "\nEnter grade: "; 
    cin >> grade; 
    _getch(); 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    fstream stu ("stud.txt", ios::in | ios::out); 
    student s1; 
    char ans = 'y'; 
    int ch, offset, mrec; 
    do 
    { 
     cout << "\nMAIN MENU:" << endl; 
     cout << "1. Add Record" << endl; 
     cout << "2. Modify Record" << endl; 
     cout << "3. Display Record" << endl; 
     cout << "4. Exit" << endl; 
     cout << "Enter your choice (1-4): "; 
     cin >> ch; 
     switch (ch) 
     { 
     case 1: s1.getdata(); 
       stu.write ((char*) &s1, sizeof (student)); 
       break; 
     case 2: if (!count) 
       { 
        cout << "No record added yet. Type option number first."; 
        _getch(); 
        break; 
       } 
       cout << "Enter the record number to be modified: "; 
       cin >> mrec; 
       if (mrec > count) 
       { 
        cout << "Error. Only " << count << " records have been added."; 
        _getch(); 
        break; 
       } 
       offset = (mrec - 1)* sizeof (student); 
       stu.seekg (offset); 
       stu.read ((char*) &s1, sizeof (student)); //C2440 
       s1.putdata(); 
       cout << "Do you want to modify your record (y/n): "; 
       cin >> ans; 
       if (ans == 'y' || ans == 'Y') 
       { 
        s1.moddata(); 
        stu.seekg(offset); 
        stu.write ((char)* &s1, sizeof (student)); 
        break; 
       } 
       break; 
     case 3: if (!count) 
       { 
        cout << "No record added yet. Type option number first."; 
        _getch(); 
        break; 
       } 
       cout << "Enter record number to be displayed: "; 
       cin >> mrec; 
       if (mrec > count) 
       { 
        cout << "Error. Only " << count << " records have been added."; 
        _getch(); 
        break; 
       } 
       offset = (mrec - 1)*, sizeof (student); 
       stu.seekg (offset); 
       stu.read ((char)* &s1, sizeof (student)); //C2440 
       s1.putdata(); 
       break; 
     case 4: break; 
     default: cout << "Wrong choice."; 
     } 
    } while (ch != 4); 
    _getch(); 
    return 0; 
} 

私はエラー番号

C2440: 'type cast' : cannot convert from 'student' to 'char' 1>  No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 

これは非常に奇妙な問題であるように思わを取得しています:

は、ここに私のコードです。私はC++で多くの経験を持っていないので、実際にはこれを解決することはできません。

+0

は、あなたが小さい再生にそれを煮詰めることができ、変更したいS1オブジェクトのメンバを使用する必要がありませんか?どの行番号がエラーですか? –

+0

下にスクロールすると、コード行に対して2つのコメント '// C2440'が表示されます。 –

+0

変化(CHAR)* =>(のchar *)、それを指摘するため – fizzbuzz

答えて

4

char *studentを変換しようとしないでください。どうしてそうするか?

read()のパラメータとして使用できる補助char *を持ってから、studentにデータを設定します。 hmjdが提案されているよう

キャストが機能するようになりましたように見えるかもしれませんが、私はそれを行うにはない、あなたを促します。文字配列がクラスの最初のメンバーであり、オブジェクトと同じアドレスにあることが起こります。しかし、メンバーが宣言された順序を変更したり、virtual関数を導入したり、別のコンパイラを使用したりしても、すべての地獄は失われます。

はキャストしないでください。

+0

乾杯。 – hmjd

+0

奇妙に見えます。明日の私の試験、私の教授や他の学生はこれを気にしていないようです。 –

+0

@hmjdはい。したがって、 'char *'にキャストしてその場所に書き込むと、vftableへのポインタを上書きします。後で仮想メソッドを呼び出そうとすると、クラッシュする可能性が高くなります。 @LuchianGrigore :) –

0

あなたは、コードの多くのオブジェクト自体

関連する問題