【问题标题】:C++ Reading file using while loop, start at line "x"C ++使用while循环读取文件,从“x”行开始
【发布时间】:2012-07-08 15:15:51
【问题描述】:

我在这个问题上纠结了一段时间。我这里有一个循环,它将读取包含文件名的文本文件。循环一一读取这些行,并通过变量 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++;
}

提前致谢!

【问题讨论】:

  • 您还必须将x 保存到某个文件中。如果你打算使用 C++,请放弃 char 数组、memset、strcpy 和类似的东西。请改用std::string 和标准算法。

标签: c++ while-loop getline feof


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        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
        }
        

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

        【讨论】:

        • 不幸的是,我需要填充结果文件。当我重新启动程序时,它需要能够从停止的地方继续读取,并且需要继续附加到结果文件。每个条目后都有一个'\n',所以效果不太好:(还是谢谢!
        • @Michael 更新了问题。当然,您将能够填充该文件。
        猜你喜欢
        • 2017-10-12
        • 2021-04-05
        • 2023-02-07
        • 2018-05-11
        • 2018-04-17
        • 1970-01-01
        • 2013-03-28
        • 2012-01-24
        • 1970-01-01
        相关资源
        最近更新 更多