我有一个数组,包含6个单词和一个秘密单词

char boardInputs[7][6];

每次用户输入单词时,我都需要自动将这个数组保存到二进制文件中.重新启动程序后,我需要从二进制文件中读取保存的单词数组,并将其安装到电路板的输入数据数组中

void readArray(int rows, int cols, char array[rows][cols]) {
    FILE *data;
    data = fopen("autosave.bin", "rb");
    fread(array, sizeof(char[rows][cols]), 1, data);
}


void autoSave() {
    int result = EXIT_SUCCESS;
    char file_name[] = "autosave.bin";
    FILE *fp = fopen(file_name, "wb");
   
    if (fp == NULL) {
        result = EXIT_FAILURE;
        fprintf(stderr, "fopen() failed for '%s'\n", file_name);
    } else {
        size_t element_size = sizeof *boardInputs;
        size_t elements_to_write = sizeof boardInputs;
        size_t elements_written = fwrite(boardInputs, element_size, elements_to_write, fp); 
        if (elements_written != elements_to_write) {
            result = EXIT_FAILURE;
            fprintf(stderr, "fwrite() failed: wrote only %zu out of %zu elements.\n", 
                    elements_written, elements_to_write);
        }

        fclose(fp);
    }
}

int main() {
    int cols = 7;
    int rows = 6;
    char (*myArray)[cols] = allocArray(rows, cols);

    readArray(rows, cols, myArray);
    strcpy(boardInputs, myArray);
    free(myArray);
}

我创建了这段代码,但是二进制文件中的单词设置不正确.如何修复它?

推荐答案

代码中存在多个问题:

  • 你不需要在readArray中测试fopen()次成功
  • 你不能在read_array分钟内关闭文件
  • resultautoSave中未使用.
  • strcpy是不正确的复制整个董事会.您应该测试readArray是否成功,并使用memcpy.
  • autoSave中的sizez不正确:size_t element_size = sizeof *boardInputs计算为一个字的大小,即6个字节,而size_t elements_to_write = sizeof boardInputs是整个数组的字节大小.fwrite将try 写入6 * 42个字节,当它访问boardInputs超出其边界时,会导致未定义的行为.数组的长度是其大小除以元素大小.在这种情况下,最好使用字节,而不是单词作为单位.
  • 为确保boardInputsmyArray之间的一致性,应根据 struct 将其定义为相同的尺寸.

以下是一个修改版本:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define WORD_COUNT 7
#define WORD_LEN   6
char boardInputs[WORD_COUNT][WORD_LEN];
const char *autoSaveFilename = "autosave.bin";

int readArray(int rows, int cols, char array[rows][cols]) {
    FILE *fp = fopen(autoSaveFilename, "rb");
    if (fp == NULL)
        return -1;
    int n = fread(array, sizeof(char[rows][cols]), 1, fp);
    fclose(fp);
    return n == 1 ? 0 : -1;
}

int autoSave(void) {
    int result = EXIT_SUCCESS;
    FILE *fp = fopen(autoSaveFilename, "wb");
   
    if (fp == NULL) {
        result = EXIT_FAILURE;
        fprintf(stderr, "fopen() failed for '%s': %s\n",
                autoSaveFilename, strerror(errno));
    } else {
        size_t element_size = 1;
        size_t elements_to_write = sizeof(boardInputs);
        size_t elements_written = fwrite(boardInputs, 1, elements_to_write, fp); 
        if (elements_written != elements_to_write) {
            result = EXIT_FAILURE;
            fprintf(stderr, "fwrite() failed: wrote only %zu bytes out of %zu.\n", 
                    elements_written, elements_to_write);
        }
        fclose(fp);
    }
    return result;
}

int main() {
    char myArray[WORD_COUNT][WORD_LEN];

    if (!readArray(WORD_COUNT, WORD_LEN, myArray))
        memcpy(boardInputs, myArray, sizeof boardInputs);

    return 0;
}

C++相关问答推荐

错误:C中需要参数声明符

在使用GTK 4 Columnview列表模型时,如何为多列添加排序函数.C编码,Linux/GNOME环境

DPDK-DumpCap不捕获端口上的传入数据包

为什么在函数内部分配内存空间时需要添加符号?

测量ARM MCU中断延迟的问题

为静态库做准备中的奇怪行为

使用scanf在C中读取和存储文件中的值

将uintptr_t添加到指针是否对称?

`#if`条件中是否允许`sizeof`?

如何使用C for Linux和Windows的标准输入与gdb/mi进行通信?

1处的解析器错误:yacc语法的语法错误

为什么中断函数会以这种方式影响数组?

tick.q中的Kdb+键控表语法

如何在C-函数中混合使用C代码和ASM?

C语言中浮点数的取整方式浮点数尾数超过23位时如何取整剩余部分

C:Assignment中的链表赋值从指针目标类型中丢弃‘const’限定符

如何在C中定义指向函数的指针并将该指针赋给函数?

C编译和运行

我编写这段代码是为了判断一个数字是质数、阿姆斯特朗还是完全数,但由于某种原因,当我使用大数时,它不会打印出来

如何为avr atmega32微控制器构建C代码,通过光电二极管捕获光强度并通过串行通信传输数据