-1

私は、テキスト ファイルを解析してそこから必要な情報を取得する小さなプログラムを作成する任務を負っています。ファイルはこのようにレイアウトされています

Tuesday*Info5051*10:00*11:00*M3039*Info5064*12:00*3:00*G1001;

基本的には、後で取得できるように各文字列を構造体に格納することになっていますが、プログラムを機能させることができません (学習障害があるため、物事が難しくなる傾向があります)。これまでの私のコードは次のとおりです。(私はそれが単純なプログラムであることを知っていますが、私は物事を考えすぎたり、台無しにしたりする傾向があります.) これまでに私が遭遇した大きな問題は、開始するためにファイルを開かないことです. ファイルを bin->debug とプログラムのメイン フォルダーに保存しました。getline メソッドを間違って使用していると確信しています。

struct Course
{
    string _sDay;
    string _sName;
    string _sCode;
    string _iStart;
    string _iDuration;
    string _sRoom;
};

int main()
{
    ifstream fileIn;
    fileIn.open("courseLoad.txt");

    vector<Course> vCourse;
    string str="*";
    string line;

    if (!fileIn)
    {
        cout<<"A error has occured, please contact support.";
    }

    while(!fileIn.eof())
    {
        for(int i=0; i!= fileIn.eof();i++)
        {
            //file.getline(entry.part_num, 6, '-');
            getline(fileIn,line,'*');
            vCourse[i]._sDay =line;
            getline(fileIn,line,'*');
            vCourse[i]._sName =line;
            getline(fileIn,line,'*');
            vCourse[i]._sCode = line;
            getline(fileIn,line,'*');
            vCourse[i]._iStart =line;
            getline(fileIn,line,'*');
            vCourse[i]._iDuration = line;
            getline(fileIn,line,'*');
            vCourse[i]._sRoom =line;

            cout<<vCourse[i];
        }//end for
    }
--output to screen here--
4

3 に答える 3

2

このコードにはいくつかの問題があります。

1) そのコードには、ファイルを開くことができない場合にプログラムが実行を継続できないようにするための return ステートメントまたは else ステートメントがありません。

if (!fileIn)
{
    cout<<"A error has occured, please contact support.";
    return -1;
}

2) getline はすべて同じ入力ストリームで動作します。行を読み込んでから、その行を解析します。例えば:

// Read in a line
while (getline(fileIn,line))
{
    string item;
    std::stringstream sstr(line);

    // Read in an item
    while (getline(sstr, item, "*"))
    {
        std::cout << item << std::endl;
    }
}

3) vCourse サイズは 0 であるため、[] 演算子は使用できません。ただし、push_back を使用してベクターのサイズを拡張し、ベクターの後ろに要素を挿入できます。

// Read in a line
while (getline(fileIn,line))
{
    string item;

    // Default course construction
    Course c;

    std::stringstream sstr(line);

    // Read in an item
    getline(sstr,item,'*');
    c._sDay = item;
    getline(sstr,item,'*');
    c._sName = item;
    getline(sstr,item,'*');
    c._sCode = item;
    getline(sstr,item,'*');
    c._iStart = item;
    getline(sstr,item,'*');
    c._iDuration = item;
    getline(sstr,item,'*');
    c._sRoom = item;

    // Save the course into the vector
    vCourse.push_back(c);
}

上記にさらにエラーチェックを追加することもできます (一部の要素が行にない場合)。

于 2012-07-04T19:34:36.867 に答える
0

ファイルの内容を単一の文字列に入れ、strtok() functionを使用することもできます。

于 2012-07-04T19:24:12.923 に答える
0

明らかな差し迫った問題の 1 つは、実際にはCourseベクターに構造体を追加しているのではなく、あたかもそうであるかのようにそれらの要素に代入していることです。例えば

    vCourse[i]._sDay =line;

しかし、実際にはCourse構造体のインスタンスをベクトルのインデックス i に追加していません。これは、存在しないインスタンスに割り当てることを意味し、これは良いニュースではありません。その前に必要なのは

    Course newItem;             // make a new Course object instance
    vCourse.push_back(newItem); // This adds the instance to the end of the vector

    // Now assign to the members of vCourse[i];
    vCourse[i]._sDay =line;
    getline(fileIn,line,'*');
    vCourse[i]._sName =line;
    getline(fileIn,line,'*');
    vCourse[i]._sCode = line;
    getline(fileIn,line,'*');
    vCourse[i]._iStart =line;
    getline(fileIn,line,'*');
    vCourse[i]._iDuration = line;
    getline(fileIn,line,'*');

次に、構造体に割り当てることができます。

また、これをやりたい場合は

    cout<<vCourse[i];

オーバーロードする必要がありますoperator<<

ファイルを開くことができない場合は、1) ファイル名のスペルが正しいこと、および 2) ファイルが実行可能ファイルと同じ場所にあることを確認する必要があります。とにかくフルパス名を書く方がおそらく安全でしょう

于 2012-07-04T19:16:26.370 に答える