繁体   English   中英

C ++使用while循环读取文件,从“x”行开始

[英]C++ Reading file using while loop, start at line “x”

我一直坚持这个问题。 我这里有一个循环,它将读取包含文件名的文本文件。 循环逐个读取这些行,并通过变量sFileName将其设置到内存中。 稍后调用sFileName加载图像,程序在循环加载图像时逐个执行此操作。 然后,用户为图像选择标签并加载下一个标签。 标签和图像文件名称将导出到另一个名为imgresults.txt的文本文件中。 现在,带有文件名的文本文件是几千行。 因此,在用户必须退出程序并尝试稍后继续的情况下,循环重新开始,而不是在程序关闭时离开。

我试图找到一种方法让循环开始在那一点。 到目前为止,我决定使用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++;
}

提前致谢!

使用ifstream :: tellg在程序关闭时检索并存储文件的当前位置。

当porgramm重新启动时,使用ifstream :: seekg恢复该位置。

如果你真的想使用imgresults.txt作为你应该从输入文件开始的位置的信息,那么你可以做的最好的事情是在你阅读的while循环之前有一个while循环来读取输入文件中的x行输入文件。

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

更好的解决方案可能是将处理状态写入另一个文件,这样您就不必逐行读取输入文件,但可以立即寻找文件中的已知偏移量。

在读取每一行之前,将输入和输出文件中的当前偏移保存到单独的文件中,回顾开头并每次覆盖现有数据。

当/如果重新启动,请从该文件中读取偏移量,寻找这些点,然后从那里开始工作。

您可以从两个文件中并行读取行,并在到达结果文件末尾时停止。 循环结束时,您已经丢弃了已处理的文件名。

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
}

不是最有效的解决方案,但它可以节省您保存偏移的麻烦。 只需确保在第一次处理之前结果文件完全为空(或根本不存在),否则此代码将跳过第一行名称文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM