【问题标题】:Skipping text file lines on reiteration of loop重复循环时跳过文本文件行
【发布时间】:2016-05-06 20:46:23
【问题描述】:

我有一个循环,它成功地将文本文件的前 9 行读入一个数组并适当地使用它。在每一次额外的传递中,我想跳过文本文件的 9 行并从那里覆盖数组。 (9行每一段的信息类型相同)

问题是我似乎无法让它跳过。我有一个变量,每次通过时递增 9,最多可达 9 个部分,它本身将来自通过测量文本文件的行生成的变量。

我认为最简单的方法是通过我想跳过的行的当前值来增加这个循环中的变量,但这要么什么也没做,要么使程序崩溃,要么使输出混乱,这取决于如何我走近了。

这是当前将信息从文本文件传递到二维数组(并删除空白)的文本区域

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;
        }
    }
}

正如现在所写的那样,该程序可以工作,并生成与文件中的表格数量相等的表格,但每次通过时都会在屏幕上打印第一个表格的精确副本。

【问题讨论】:

    标签: c++ arrays file loops multidimensional-array


    【解决方案1】:

    您可以使用fgetpos 来保存文件中前9 行结束的点。

    然后,在下一个循环中,您可以使用fsetpos 检索文本文件的位置。

    这是你的做法:

    • 首先声明变量来存储你的位置。使用的类型是fpos_t
    • 然后在循环到达第9行末尾的点,使用getpos保存文件的位置。
    • 您可以使用fsetpos 检索位置并从上一个循环停止的地方继续

      fpos_t 位置;

      fgetpos(fp, &pos); // 保存位置

      fsetpos(fp, &pos); // 现在将位置恢复到我们保存的位置

    【讨论】:

    • 这听起来绝对是个好方法。不幸的是,文本文件是由用户选择的,当我显然必须使用不同的方法打开文件时,当我不使用常量时,这会给我带来错误。除非那是错的?不过回答得很好。
    • 看起来它也必须是一个字符。
    【解决方案2】:

    为了让它发挥作用,我做了以下工作:

    在文件关闭之前它不会丢失位置,因此我没有在循环结束时关闭它然后尝试重新打开,而是在循环顶部附近设置了这个:

    if (!file.is_open())
    {
        file.open(games);
    }
    

    这只是检查文件是否打开。如果它没有打开,它将打开它。这样文件将在第一次运行时打开,并且不会尝试重新打开。然后可以在循环结束后关闭文件。

    肯定比更改文件打开方式或通过存储变量来跟踪事物的过程更容易。

    【讨论】:

      【解决方案3】:

      我把这称为兔子洞问题。

      您必须模拟或编写一个不利用现有重复 ++xif then else 循环。

      另一种方法是使用除xy 以及z 以外的变量,它们使用您的映射坐标系。例如,将您的重复循环标记为reitLoopXreitLoopY。但是,您陈述问题的方式是您的编译器有命名约定锁定。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-21
        • 2011-12-21
        • 2013-11-01
        • 1970-01-01
        • 2021-01-01
        • 1970-01-01
        • 2015-05-08
        相关资源
        最近更新 更多