3

ユーザーが自分の DVD を追跡できるようにするプログラムを作成しようとしています。各映画にこれらの属性を含む入力ファイルを使用してください。

基本的に、ユーザーは入力ファイルの名前を入力できる必要があります。構造体とポインターを使用して、入力ファイル内のムービーのリンク リストを作成しました。次に、リンクされたリストを出力ファイルに出力します。プロットの出力をワード ラップするようにフォーマットします。

出力は次のようになります

***************************************************************************
MOVIE #: 1 Title: Antwone Fisher
---------------------------------------------------------------------------
Year: 2002 Rating: 7
---------------------------------------------------------------------------
Leading Actor: Denzel Washington Genre 1: Biography
Supporting Actor: Derek Luke Genre 2: Drama
---------------------------------------------------------------------------
PLOT: 
Antwone Fisher, a young navy man, is forced to see a psychiatrist after a 
violent outburst against a fellow crewman. During the course of treatment 
a painful past is revealed and a new hope begins.
***************************************************************************

これまでのところ、問題は私の出力であり、出力を表示できません。私はそれをデバッグしようとしましたが、while ループでスタックしていることがわかりました。

ここに私の出力関数があります

 void OutputList(MovieDVD *head)
{
    ofstream OFile;
    OFile.open("OFile.txt");

    MovieDVD *dvdPtr;
    dvdPtr = head;


    cout << "Before While Output " << endl;

    while(dvdPtr != NULL)
    {
        OFile << left;
        OFile << dvdPtr -> title;

        OFile << dvdPtr -> leadActor;

        OFile << dvdPtr -> supportActor;
        OFile << setfill('*') << setw(25) << '*' << endl;
        OFile << dvdPtr -> genre;
        OFile << setfill('*') << setw(25) << '*' << endl;
        OFile << dvdPtr -> altGenre;
        OFile << setfill('*') << setw(25) << '*' << endl;
        OFile << dvdPtr -> year;
        OFile << setfill('*') << setw(25) << '*' << endl;
        OFile << dvdPtr -> rating;
        OFile << setfill('*') << setw(25) << '*' << endl;
        OFile << dvdPtr -> synopsis;
        OFile << setfill('*') << setw(25) << '*' << endl;

        dvdPtr = dvdPtr -> next;
        cout << endl;

        cout << "READ - AFTER LINE OUTPUT" << endl;
    }
    cout << " DEBUG -- AFTER WHILE OUTPUT" << endl;

    delete dvdPtr;
    dvdPtr = NULL;
    OFile.close();
}


Here my main function:

    //INPUT OUTPUT FILE DECLARATION
    ifstream inFile;                    //INPUT FILE declaration
    ofstream OFile;                     //OUTPUT FILE declaration

    //VARIABLE DECLARATION
    string inputFileName;               //IN  - Input file name
    string outputFileName;              //OUT - Output file name
    string synopsis;
    MovieDVD *head;
    MovieDVD theMovie;



    head = NULL;

    //INPUT
    cout << "What input file would you like to use?: ";
    getline(cin, inputFileName);
    cout << "DEBUG -- BEFORE CREATELIST "<< endl;

    CreateList(head, inputFileName);
    cout << "DEBUG -- AFTER CREAETLIST " << endl;

    //OUTPUT LIST
    cout << "What output file would you like to use?: ";
    getline(cin, outputFileName);


    OutputList(head);
    WordWrap(OFile, head, synopsis);

出力リストにデバッグ用の cout を追加し、 cout << "Before While Output " << endlcout << " DEBUG -- AFTER WHILE OUTPUT" << endlてきて while ループをスキップします。お願い助けて。

マイクリエイティブリスト機能

void CreateList(MovieDVD *head, string inputFileName)
{
    ifstream inFile;
    inFile.open("inFile.txt");

    MovieDVD *dvdPtr;

    head = NULL;
    dvdPtr = NULL;
    dvdPtr = new MovieDVD;

    int counter =0;

    cout << " DEBUG -- BEFORE WHILE" << endl;
    while (inFile && (dvdPtr != NULL))
    {
        getline(inFile, dvdPtr -> title);

        getline(inFile, dvdPtr -> leadActor);

        getline(inFile, dvdPtr -> supportActor);


        getline(inFile, dvdPtr -> genre);

        getline(inFile, dvdPtr -> altGenre);

        inFile >> dvdPtr -> year;

        inFile >> dvdPtr -> rating;
        inFile.ignore(1000, '\n');

        getline(inFile, dvdPtr -> synopsis);

        dvdPtr -> next = head;
        head = dvdPtr;
        dvdPtr = new MovieDVD;

        cout << "READ line " << counter++ << endl;
    }
cout << " DEBUG -- AFTER WHILE" << endl;

    delete dvdPtr;
    dvdPtr = NULL;
    inFile.close();

}

4

2 に答える 2

0

おそらく、whileループにはまったく入っていません。印刷できますdvdPtrか?それは可能性がありますnull

于 2012-11-14T06:24:22.090 に答える
0

関数にリストを作成していませんCreateList。ええと、あなたはそうですが、あなたが望む方法ではありません。ほら、あなたのリストが作成されており、ポインタdvdPtrがそれを指しています。ここまでは順調ですね。しかし、あなたはこれを行います:

head = dvdPtr;

関数が終了した後、headポインターがリストを保持すると想定しますが、それは間違っています。この行では、ローカルポインターを変更しているため、関数が終了すると、そのポインターは失われます。whileこれがおそらく、出力がループをスキップする理由です。リストは空です。ポインタへの参照を渡す必要があります。

void CreateList(MovieDVD *&head, string inputFileName)

その後、それはあなたが望むようにそれを変更することを可能にします。

于 2012-11-14T06:38:04.610 に答える