我在代码的最后部分遇到了我的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;
    }


在main的最后一部分:

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;
}

最佳答案

通过快速阅读您的代码,我注意到您正在打开文件以进行两次写入。第一次是在主函数的开头,第二次是在printMovieInfo函数中。

您实际上不应该打开文件来写入两次,因为2个流可以位于不同的位置。

您可以做的是将主函数中的ofstream传递给printMovieInfo函数作为参考。希望那应该解决问题。

快速浏览一下您的代码,您也许还可以在调用printMovieInfo之前冲洗流。我仍然会建议第一种选择。

否则,按照Roberto的要求,您可能无法从输入文件中获取所有数据。

10-07 17:45