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: %sn",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," ");
strcat(sFileName,s);
printf (sFileName);
nCounter++;
}
提前感谢!
如果您真的想使用imgresults.txt作为从输入文件开始的信息,那么最好在读取输入文件的while循环之前使用while循环从输入文件读取x行。
while (x--) {
fgets(sLine, MAX_FILENAME_SIZE, fIn);
}
更好的解决方案可能是将处理状态写入另一个文件,这样您就不必逐行读取输入文件,但可以立即查找文件中的已知偏移量。
当程序关闭时,使用ifstream::tellg检索并存储文件的当前位置。
当Porgram重新启动时,使用ifstream::seekg恢复该位置。
在读取每一行之前,将输入和输出文件中的当前偏移量保存到一个单独的文件中,每次都会查找到开头并覆盖现有数据。
重新启动时/如果重新启动,请读取该文件的偏移量,查找这些点,然后从那里开始工作。
您可以从两个文件中并行读取行,并在到达结果文件末尾时停止。循环结束时,您已经放弃了已经处理过的文件名。
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
}
这不是最有效的解决方案,但它为您省去了保存偏移的麻烦。只需确保在第一次处理之前,结果文件是完全空的(或者根本不存在),否则此代码将跳过名称文件的第一行。
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 从末尾开始的字符串中获取反向子字符串
- C++ 从具有开始位置和结束位置的列表中删除
- C++程序从主程序开始执行并在主程序结束?
- 如何在C++中返回向量的从零开始的索引
- 我看过Stellarium代码,我不知道它从哪里开始
- 从午夜开始以最低的延迟获得纳秒
- 如何将从第 2 个字符开始的字符串作为函数中的参数传递以进行递归,并约束数据 tiee 是函数中的字符串?
- 为什么 std::cin 从一开始就不读
- 使用递归从尾部开始反转链表
- 尝试查找从索引 0 开始的偶数长度子字符串
- 如何初始化非静态模板成员变量从临时工开始,即而无需复制或移动
- 从哪里开始C GUI
- 从第 x 列提取到 y 列,从第 1 行到第 2 行提取 csv 数据 c++
- 如何在XML文件中写入,而不要从问号C 开始
- 从两端开始浏览列表,然后使用迭代器在中间停止
- 普通模板在哪里结束,元模板从哪里开始
- 为什么C++向量大小从 4294967296 开始,而调试器将其读取为 0?
- 从第 3 位开始读取 int 的最快方法?
- C++ 使用 while 循环读取文件,从第 "x" 行开始