2012-07-08 142 views
0

我一直在這個問題上停留了一段時間。我在這裏有一個循環,它將讀取包含文件名的文本文件。循環逐一讀取這些行,並通過變量sFileName將其設置到內存中。 sFileName稍後被調用來加載圖像,並且該程序在循環加載它時逐個執行此操作。用戶然後爲圖像選擇一個標籤並加載下一個標籤。標記和圖像文件名被導出到另一個名爲imgresults.txt的文本文件中。現在,帶有文件名的文本文件是幾千行。因此,如果用戶必須退出程序並在稍後嘗試繼續,則循環將重新啓動,而不是在程序關閉時停止。C++使用while循環讀取文件,從「x」行開始

我想找到一種方法讓循環開始在那一點。到目前爲止,我決定使用getline()來計算imgresults.txt中當前有多少行,因爲這會提供已經在程序中運行的圖像的數量。該號碼存儲在變量「x」中。我一直在做很多研究,但我無法找到如何爲while循環開始的行「x」設置條件。你們有什麼建議嗎?另外,如果您需要任何澄清,請詢問。我只包含關於循環的代碼,因爲加載圖像的代碼是完美的。

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    int value = 0; 

int nCounter = 0; 
FILE* fIn = NULL; 
char * sLine = new char[MAX_FILENAME_SIZE]; 
char * sFileName = new char [MAX_FILENAME_SIZE]; 
char * s = new char [MAX_FILENAME_SIZE]; 

#define ImgListFileName "path" 
#define ImgRepository "path" 



if ((fIn = fopen(ImgListFileName,"rt"))==NULL) 

{ 
    printf("Failed to open file: %s\n",ImgListFileName); 
    return nCounter; 
} 



ifstream imgresults; 
    imgresults.open ("imgresults.txt"); 
    int x=0; 
    string line; 

    while(!imgresults.eof()) { 
     getline (imgresults, line); 
     x++; 
    } 
    srand (time(NULL)); 
    cout << x; 


    while(!feof(fIn)){ 
     memset(sLine,0,MAX_FILENAME_SIZE*sizeof(char)); 
     memset(sFileName,0,MAX_FILENAME_SIZE*sizeof(char)); 
     memset(s,0,MAX_FILENAME_SIZE*sizeof(char)); 
     fgets(sLine,MAX_FILENAME_SIZE,fIn); 
     strncpy(s,sLine,65); 
     strcat(sLine,"\0"); 
     strcat(sFileName,s); 


     printf (sFileName); 

     nCounter++; 
} 

在此先感謝!

+2

查看http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong而你在它。 – Mat 2012-07-08 15:20:19

+1

您必須將'x'保存到某個文件中。如果你要使用C++,請清除char數組,memset,strcpy和類似的東西。改用'std :: string'和標準算法。 – jrok 2012-07-08 15:25:51

回答

1

如果您真的想使用imgresults.txt作爲您從輸入文件開始的位置的信息,那麼您可以做的最好的做法是有一個while循環以便在輸入文件之前從輸入文件中讀取x行循環讀取輸入文件的位置。

while (x--) { 
    fgets(sLine, MAX_FILENAME_SIZE, fIn); 
} 

更好的解決方案可能會寫處理的狀態到另一個文件,這樣你就不必逐行讀取輸入文件中的行,但你可以立即尋求到文件中的已知偏移。

+0

這工作得很好。謝謝:) – Michael 2012-07-08 17:01:49

1

使用ifstream::tellg可以在程序關閉時檢索和存儲文件的當前位置。

使用​​在porgramm重新啓動時恢復該位置。

0

在讀取每一行之前,請將輸入和輸出文件中的當前偏移量保存到單獨的文件中,每次都要回溯到開頭並覆蓋現有數據。

當/如果重新啓動,從該文件讀取偏移量,尋找這些點,然後從那裏開始工作。

0

您可以從兩個文件中並行讀取行並在達到結果文件結尾時停止。循環結束時,您已經丟棄了已處理的文件名。

ifstream results("results.txt"); 
ifstream names("names.txt"); 

if (results && names) { 
    std::string temp1, temp2; 
    while (getline(results, temp1) && getline(names, temp2)) ; /* do nothing */ 
} 

if (names) { 
    // process the rest 
} 

不是最有效的解決方案,但它可以爲您節省補償的麻煩。只要確保在第一次處理之前結果文件完全是空的(或根本不存在),否則此代碼將跳過名稱文件的第一行。

+0

不幸的是,我需要結果文件填充。當我重新啓動程序時,它需要能夠從停止的地方繼續讀取,並且需要繼續追加到結果文件。在每次輸入後都有一個'\ n',這樣就不能很好地工作:(謝謝! – Michael 2012-07-08 15:53:55

+0

@Michael更新了問題。當然你可以填充文件。 – jrok 2012-07-08 16:53:18