user1561949
user1561949

Reputation: 211

ofstream doesn't write everything—truncated data

I am having trouble with my ofstream variable at the last part of my code. How can I avoid losing the information from the ofstream? The issue is generated by the very last part of the program.

Here is what I am getting:

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

And here is what I should be getting:

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

Here is my print function: The error has to be here, but I don't know how to fix it

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;

}

Edited to:

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

and in the last part of main:

ij.printMovieInfo("printList.txt");

changed to

ij.printMovieInfo(outFile);

Here is my main function: The problem is generated at the end of the program

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

Upvotes: 0

Views: 1032

Answers (1)

Aleks
Aleks

Reputation: 531

From a quick read over your code I have noticed that you are opening the file for writing twice. The first time is right at the beginning of your main function and the second is in your printMovieInfo function.

You really should not open a file for writing twice as the 2 streams can be at different positions.

What you can do is to pass in your ofstream that is in your main function to your printMovieInfo function as a reference. Hopefully that should fix the problem.

With a quick further glance at your code you may also be able to get away with flushing the stream before calling your printMovieInfo. I still would recommend the first option though.

Otherwise, as asked by Roberto, you may not be getting all the data from your input file.

Upvotes: 2

Related Questions