2012-08-29 53 views
0

我在我的代碼的最後部分我的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; 
    } 

,並在主要的最後一部分:

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

你爲什麼打開文件兩次?只需將你的流傳遞給printMovieInfo函數即可。 – Aleks

+1

當您從'movie1.txt'讀取每段數據以驗證它正在被正確收集時,您是否嘗試將輸出打印到控制檯? – ChiefTwoPencils

回答

2

從快速閱讀您的代碼我已經注意到,您正在打開文件的寫作兩次。第一次是在你主要功能的開始,第二次是在你的printMovieInfo函數中。

你真的不應該打開一個文件來寫兩次,因爲這兩個流可以在不同的位置。

你可以做的是將你的主流函數中的流傳遞給printMovieInfo函數作爲參考。希望能解決這個問題。

通過快速瀏覽您的代碼,您可能還可以在調用printMovieInfo之前清空流。我仍然會推薦第一個選項。

否則,如Roberto所問,您可能無法從您的輸入文件中獲取所有數據。

+0

好的。多謝你們。 – user1561949