我有一个循环,它成功地将文本文件的前9行读入数组并正确使用它。在每个额外的传递中,我想跳过9行文本文件并从那里覆盖数组。 (9行的每个部分都有相同类型的信息)
问题在于我似乎无法跳过它。我有一个变量,每次传递时增加9,最多9个部分的数量,它本身来自通过测量文本文件的行生成的变量。
我认为最简单的方法是通过我想要跳过的行的当前值来增加此循环中的变量,但是要么没有做任何事情,要么使程序崩溃,要么输出混乱,这取决于我如何接近它。
这是当前将信息从文本文件传递到2D数组(并删除空白区域)的文本区域
for (int x = (0); x < BOARD_SIZE + 1; ++x)
{
for (int y = 0; y < BOARD_SIZE; ++y)
{
// Initializing as Z because that's not a possible input from file.
// If it appears something is wrong.
char point = 'Z';
if (!file.get(point))
cout << "There seems to be a problem with the file." << x << "," << y << endl;
if (isblank(point))
{
// Without this, it will spit out spaces every other character of the array
--y;
}
else
{
chessBoards[x][y] = point;
}
}
}
正如现在所写的那样,该程序可以工作,并生成一些表格,这些表格等于文件中的表格数量,但每次通过时会在屏幕上打印出第一张表格的精确副本。
答案 0 :(得分:1)
您可以使用fgetpos
将该点保存在前9行结束的文件中。
然后,在下一个循环中,您可以使用fsetpos
来检索文本文件的位置。
以下是您的操作方法:
fpos_t
getpos
保存文件的位置。您可以使用fsetpos
检索位置,并从上一个循环停止的位置继续
fpos_t pos;
fgetpos(fp,&amp; pos); //保存位置
fsetpos(fp,&amp; pos); //现在将位置恢复到我们保存的位置
答案 1 :(得分:1)
以下是我的工作:
在文件关闭之前它不会失去位置,所以不是在循环结束时关闭它然后尝试重新打开,我把它放在循环的顶部附近:
if (!file.is_open())
{
file.open(games);
}
这只是检查文件是否打开。如果没有打开,它会打开它。这样文件将在第一次运行时打开,并且不会尝试重新打开。然后可以在循环结束后关闭该文件。
当然比改变文件打开或存储变量以跟踪事物的过程更容易。
答案 2 :(得分:0)
我把这称为兔子洞问题。
您必须模拟或编写不利用现有重复if then else
的{{1}}循环。
另一种方法是使用++x
和x
以及y
以外的其他变量,它们使用映射的坐标系。例如,将重复循环标记为z
和reitLoopX
。但是,您所说的问题的方式使您的编译器具有命名约定锁定。