假设我有一个程序(具体来说是一个游戏),其中包含一个 char 数组
称为 board
并具有 256 个元素。如果我想更新那个数组
来自磁盘上的保存文件,并验证没有非法
正在将字符写入数组,我可以做以下几件事之一:
首先验证一切。如果没有错误,将文件读入数组。
创建旧阵列的备份副本。检查时写入数组。 如果有错误,显示一条消息并复制备份阵列 进入真正的数组。否则,直接返回。
创建新数组。检查时写入新数组。如果有 一个错误,显示一条消息,不做任何其他事情。如果有 没有错误,将新数组复制到真实数组中。
我意识到我可能对第 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/