ofstream записывает не все — усеченные данные

У меня проблемы с моей переменной 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;
}

person user1561949    schedule 29.08.2012    source источник
comment
Почему вы открываете файл дважды? Просто передайте свой поток в функцию printMovieInfo.   -  person Aleks    schedule 29.08.2012
comment
Пробовали ли вы выводить вывод на консоль при чтении каждой части данных из movie1.txt, чтобы убедиться, что они собираются правильно?   -  person ChiefTwoPencils    schedule 29.08.2012


Ответы (1)


Из быстрого чтения вашего кода я заметил, что вы дважды открываете файл для записи. Первый раз — в самом начале вашей основной функции, а второй — в вашей функции printMovieInfo.

Вы действительно не должны открывать файл для записи дважды, так как 2 потока могут находиться в разных позициях.

Что вы можете сделать, так это передать свой поток, который находится в вашей основной функции, в вашу функцию printMovieInfo в качестве ссылки. Надеюсь, это должно решить проблему.

Быстро взглянув на свой код, вы также можете избавиться от очистки потока перед вызовом вашего printMovieInfo. Я бы все же рекомендовал первый вариант.

В противном случае, как сказал Роберто, вы можете не получить все данные из вашего входного файла.

person Aleks    schedule 29.08.2012