2012-07-08 144 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