0

コードの最後の部分でofstream変数に問題があります。オフストリームから情報が失われるのを防ぐにはどうすればよいですか?この問題は、プログラムの最後の部分で発生します。

これが私が得ているものです:

Action Movies

Comedy Movies

Drama Movies

Horror Movies
There are no movies for this genre

Mystery Movies
There are no movies for this genre

Romantic Movies

Adventure Movies

Western Movies

ife 1946 D 130 30 8.6 1946 103101
The Best Years of Our Lives 1946 R 172 181 8.1 1946 17648
Lawrence of Arabia 1962 V 216 48 8.5 1962 80746
For a Few Dollars More 1965 W 132 123 8.2 1965 45515

そして、これが私が得るべきものです:

Action Movies
Braveheart 1995 A 177 88 8.3 1995 245089
Batman begins 2005 A 140 110 8.3 2005 275523

Comedy Movies
Amelie 2001 C 122 45 8.5 2001 185124
Singin' in the Rain 1952 C 103 77 8.3 1952 56368

Drama Movies
it's a Wonderful Life 1946 D 130 30 8.6 1946 103101

Horror Movies
There are no movies for this genre

Mystery Movies
There are no movies for this genre

Romantic Movies
The Best Years of Our Lives 1946 R 172 181 8.1 1946 17648

Adventure Movies
Lawrence of Arabia 1962 V 216 48 8.5 1962 80746

Western Movies
For a Few Dollars More 1965 W 132 123 8.2 1965 45515

これが私の印刷機能です:エラーはここにある必要がありますが、それを修正する方法がわかりません

void movieType::printMovieInfo(char* outFileName) 
{
std::ofstream outFile;
if(!outFile.is_open()) 
    outFile.open(outFileName, std::ios::app);

outFile<<name<<" "<<year<<" "<<genre<<" "<<length<<" "<<rank;
outFile<<" "<<weight<<" "<<year<<" "<<votes<<std::endl;

}

編集者:

void movieType::printMovieInfo(std::ofstream& outFile) 
    {
    outFile<<name<<" "<<year<<" "<<genre<<" "<<length<<" "<<rank;
    outFile<<" "<<weight<<" "<<year<<" "<<votes<<std::endl;
    }

そしてメインの最後の部分で:

ij.printMovieInfo("printList.txt");

に変更されました

ij.printMovieInfo(outFile);

これが私の主な機能です:問題はプログラムの最後に生成されます

#include "movieType.h"
#include <iostream>
#include <fstream>
#include <string>
#include "PQType.h"
#include "QueType.h"//FIFO queue 

using namespace std;

int main()
{
movieType movie[9];
ifstream inFile("movie1.txt");
ofstream outFile("printList.txt");

int i =0;
bool notDone=true;
while (notDone) 
{ 
    if (movie[i++].readMovieInfo(inFile)== false)
        notDone=false;    
}

PQType<movieType> PQqueue(8);

int j=0;
while(!PQqueue.IsFull())
{
    PQqueue.Enqueue(movie[j++]);
}

QueType<movieType> fifoQueue[8];

string Genre[8]={"Action", "Comedy", "Drama", "Horror", "Mystery", "Romantic", "Adventure","Western"};

movieType it;
while (!PQqueue.IsEmpty())
{
    PQqueue.Dequeue(it);

    if (it.getGenre() == 'A')
        fifoQueue[0].Enqueue(it);
    else if (it.getGenre() == 'C' )
        fifoQueue[1].Enqueue(it);
    else if (it.getGenre() == 'D')
        fifoQueue[2].Enqueue(it);
    else if (it.getGenre() == 'H')
        fifoQueue[3].Enqueue(it);
    else if (it.getGenre() == 'M')
        fifoQueue[4].Enqueue(it);
    else if (it.getGenre() == 'R')
        fifoQueue[5].Enqueue(it);
    else if (it.getGenre() == 'V')
        fifoQueue[6].Enqueue(it);
    else if (it.getGenre() == 'W')
        fifoQueue[7].Enqueue(it);
}

//Problem is generated here.
movieType ij;   
for (int i=0;i<8;++i)
{
    outFile<<Genre[i]<<" Movies"<<endl;

    if (fifoQueue[i].IsEmpty())
        outFile<<"There are no movies for this genre"<<endl;

    for(int j=0; fifoQueue[i].IsEmpty() != true; ++j)
    {
        fifoQueue[i].Dequeue(ij);
        ij.printMovieInfo("printList.txt");
    }

    outFile<<endl;
}
    return 0;
}
4

1 に答える 1

2

コードをざっと読んだところ、書き込み用にファイルを 2 回開いていることに気付きました。1 回目は main 関数の最初にあり、2 回目は printMovieInfo 関数にあります。

2 つのストリームが異なる位置にある可能性があるため、書き込み用にファイルを 2 回開くべきではありません。

できることは、メイン関数にある ofstream を参照として printMovieInfo 関数に渡すことです。うまくいけば、それで問題が解決するはずです。

コードをざっと見てみると、printMovieInfo を呼び出す前にストリームをフラッシュすることもできます。ただし、最初のオプションをお勧めします。

そうしないと、Roberto が尋ねたように、入力ファイルからすべてのデータを取得できない可能性があります。

于 2012-08-29T03:38:58.173 に答える