c - 从文件更新数组,在 C 中进行验证

标签 c arrays file

假设我有一个程序(具体来说是一个游戏),其中包含一个 char 数组 称为 board 并具有 256 个元素。如果我想更新那个数组 来自磁盘上的保存文件,并验证没有非法 正在将字符写入数组,我可以做以下几件事之一:

  1. 首先验证一切。如果没有错误,将文件读入数组。

  2. 创建旧阵列的备份副本。检查时写入数组。 如果有错误,显示一条消息并复制备份阵列 进入真正的数组。否则,直接返回。

  3. 创建新数组。检查时写入新数组。如果有 一个错误,显示一条消息,不做任何其他事情。如果有 没有错误,将新数组复制到真实数组中。

我意识到我可能对第 2 点使用了一些极其模糊的语言 和 3,所以我将举一些例子:

方法一

void load_and_verify(char board[], const char *file)
{
    FILE *fp = fopen(file, "r");
    verify_board(board);

    for (int i = 0; i < 256; ++i) {
        int ch = fgetc(fp);

        if (ch == EOF) {
            return;
        }

        board[i] = ch;
    }
}

void verify_board(char board[]) {
    for (int i = 0; i < 256; ++i) {
        if (!is_valid_board_char(ch)) {
            exit(EXIT_FAILURE);
        }
    }
}

方法二

void load_and_verify(char board[], const char *file)
{
    FILE *fp = fopen(file, "r");
    char backup_board[256];
    memcpy(backup_board, board, 256);

    for (int i = 0; i < 256; ++i) {
        int ch = fgetc(fp);

        if (ch == EOF) {
            return;
        }

        if (!is_valid_board_char(ch)) {
            memcpy(board, backup_board, 256);
            return;
        }

        board[i] = ch;
    }
}

方法三

void load_and_verify(char board[], const char *file)
{
    FILE *fp = fopen(file, "r");
    char new_board[256];

    for (int i = 0; i < 256; ++i) {
        int ch = fgetc(fp);

        if (ch == EOF) {
            return;
        }

        if (!is_valid_board_char(ch)) {
            return;
        }

        new_board[i] = ch;
    }

    memcpy(board, new_board, 256);
}

每种方法的优缺点是什么?

最佳答案

我会选择方法三,因为在出​​现错误时无需回溯并且生成更易于阅读的代码。

我还建议您在一次调用中读取整个文件内容(使用 fread 或 fgets 而不是 fgetc),这将大大提高性能。

最后,无论您使用哪种方法,记得在返回前关闭

关于c - 从文件更新数组,在 C 中进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39896734/

相关文章:

c - c中将元素插入二叉树

arrays - 对于数百万个对象,如果实时需要,是存储在数组中好还是存储在像redis这样的数据库中好?

perl - 如何遍历嵌套数组?

java - 在 Java 中设置文件权限

c++ - SDL 1.3 : how to inplement simple scale-9-grid for image resize?

c++ - 无法理解语法和优先级

c - 没有给出正确的输出

javascript - 将二维数组转换为一维数组,交替使用它们的值

javascript - 如何删除NodeJs目录中的所有json文件

java - 为什么现有文件不存在?