1

構造体配列を使っていろいろなことをするプログラムを書こうとしていますが、関数に問題があります。エラーE2235「メンバー関数を呼び出す必要があるか、そのアドレスを関数 read(student *, int) で取得する必要があります」が発生し続けますが、このエラーの原因がよくわかりません。私のコードは次のとおりです。

#include <iostream.h>
#include <fstream>
struct student{
    string first;
    string last;
    string id;
    double GPA;
    int age;
};
void menu();
void read(student* data, int x);
int main(){

bool quit=false;
char choice;
student data[20];
cout<<"Welcome!"<<endl;
//the program is menu driven, so a switch statement allows for many choices
while(!quit){
    menu();
    cin>>choice;
    switch(choice){
        case '1': read(data, 20); break;
        case '2': break;
        case '3': break;
        case '4': break;
        case '5': break;
        case '6': break;
        case '7': break;
        case '8': cout<<endl<<"Goodbye!\n"; quit=true; break;
        default: cout<<"I think you're doing it wrong. Please try again.";
        }
    }
} 

//menu output so the user knows what they're doing
void menu(){
    cout<<endl;
    cout<<"What would you like to do?"<<endl;
    cout<<"(1) - Read data into the database"<<endl;
    cout<<"(2) - Add a student"<<endl;
    cout<<"(3) - Remove a student"<<endl;
    cout<<"(4) - List all students"<<endl;
    cout<<"(5) - Compute the average GPA and SD of the database"<<endl;
    cout<<"(6) - View Student Information"<<endl;
    cout<<"(7) - Save the database"<<endl;
    cout<<"(8) - Exit"<<endl;
}

//the problem function
void read(student* data, int x){
    ifstream infile;
    infile.open("StudentStruct.txt");
    int k=0;
    string first, last, id;
    double GPA;
    int age;
    while(!infile.eof&&k<x){
        infile>>first;
        data[k].first;
        infile>>last;
        data[k].last;
        infile>>id;
        data[k].id;
        infile>>GPA;
        data[k].GPA;
        infile>>id;
        data[k].age;
        k++;
    }
    cout<<"The database now contains "<<k<<" data entries from 'StudentStruct.txt'"<<endl;
}

このエラーの原因は何ですか?どうすれば修正できますか?

4

2 に答える 2

2

問題の関数をいくつかの別々の部分に分割します。ファイルから単一の「レコード」を読み取るだけです。もう 1 つはそれを使用してすべてのレコードを読み取ります。1 つ目は、慣例により、次のように名前が付けられoperator>>ています (「ストリーム エクストラクタ」とも呼ばれます)。

std::istream &operator>>(std::istream &infile, student &d) { 
    infile >> d.first;
    infile >> d.last;
    infile >> d.id;
    infile >> d.GPA;
    infile >> d.age;
    return infile;
}

2 番目の関数は、その関数を使用して、ファイルからすべてのデータを読み取ります。そのためには、使用したくありませんwhile (!whatever.eof())-それは失敗することがほぼ保証されています。いくつかの選択肢があります。1つは次のようなものです:

while (infile >> some_student)
    students.push_back(some_student);

別の可能性は、istream_iteratorループ全体をほぼ自動化できる を使用することです。

std::vector<student> students((std::istream_iterator<student>(infile)),
                                std::istream_iterator<student>());

これはstudentsvector を定義し、それを s のペアから初期化しますistream_iterator。これはファイルを暗黙的にループし、すべてのデータを読み取ります (上からストリーム エクストラクタを使用します)。

それが意味するように、std::vector<student>代わりに(可能であれば)を使用するstudent *ので、データを収容するために必要な場合はサイズを変更できます。これらを使用すると、関数は次のようになります。

std::vector<student> read() { 
    std::ifstream infile("StudentStruct.txt");
    std::vector<student> students((std::istream_iterator<student>(infile)),
                                    std::istream_iterator<student>());
    return students;
}
于 2012-12-10T03:45:13.170 に答える
1

whileこれは、条件内のコードに関連する不自然な表現のエラー メッセージだと思いますinfile.eof。関数呼び出し規則 (つまりinfile.eof()) を使用していないため、コンパイラはそのコードで何をしようとしているのかを知りません: メンバー関数を呼び出すか、そのアドレスを取得します。そのため、警告がスローされます。

ファイルから学生データを読み取る方法には、別の問題もあります。

string first, last, id;
double GPA;
int age;

while(!infile.eof&&k<x){
    // Here you read a string into the local variable 'first'
    infile>>first;

    // And here you do... what? referencing the 'first' member variable of the k'th student.
    data[k].first;

    // Rinse, lather repeat
    infile>>last;
    data[k].last;
    infile>>id;
    data[k].id;
    infile>>GPA;
    data[k].GPA;
    infile>>id;
    data[k].age;
    k++;
}

あなたがしていることを注意深く見てくださいdata。値をローカル変数に読み込み、結果を破棄し、決して使用しません。infile.eof()代わりに、try thisの使用を排除することに関する chris の提案を統合します。

while((k < x) && (infile >> data[k].first)) 
{
    infile >> data[k].last;
    infile >> data[k].id;
    infile >> data[k].GPA;
    infile >> data[k].age;

    k++;
}
于 2012-12-10T03:19:25.570 に答える