gpt4 book ai didi

c - 需要有关二进制文件的帮助

转载 作者:行者123 更新时间:2023-11-30 16:38:51 25 4
gpt4 key购买 nike

我在创建代码来创建包含多行的 bin 文件时遇到问题,每行包含 6 个值。例如:我正在做一个小项目,其中每一行都是一个“密码”,因此我的系统将加载该文件并在更新时从中读取所有密码等。我还没有实现读取文件的方法,因为我正在努力操作该文件。该项目将在 Linux 上运行,并具有 Raspberry pi 的 GPIO 功能所以我使用 Visual Studio 来创建主代码。

我当前的代码是:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char keys[4] = { '1', '2', '3', '4' }; // NOT USING
char temp_key[6];

int incl_key() {
int i;
FILE *fp;
char code = "0";
int control = 0;
int var_internal = 0;

fp = fopen("keys.bin", "wb");
if (fp == NULL) {
printf("\n Error opening file. \n");
}

printf("write your sequence <6 digits>:\n");

do{
scanf("%s", &temp_key);
fputs(temp_key, fp);
fputs("\n", fp);
control++;
} while (control < 5);
fclose(fp);
}

int keys_db() {
return 0;
}

int main() {
incl_key();

system("PAUSE");
}

提前致谢。

最佳答案

数组对于用户输入的字符串来说太小。

char temp_key[6];
printf("write your sequence <6 digits>:\n");
scanf("%s", &temp_key); // poor code
<小时/>

A string is a contiguous sequence of characters terminated by and including the first null character.

当输入12345时, 6, Enter,输入 '1', '2', '3''4''5''6''\n' 转换为 标准输入scanf("%s", temp_key); 查找前导空格,没有看到,然后读取 6 个非空格字符并将其保存在 temp_key[0]temp_key[1],....temp_key[5]。读取'\n'(一个空格),"%s"指示停止扫描更多内容,将'\n' 返回到 stdin 以便稍后输入,然后尝试将空字符附加到 temp_key[6] 中以使其成为字符串。但 temp_key[] 对此来说太小了,因此任何事情都可能发生 - 这是未定义的行为。其余代码无关紧要。

scanf("%s", &temp_key); 是不正确的代码,原因有 3 个。

  1. &temp_key 当需要数组第一个元素的地址匹配 "%s" 时传递数组的地址。这两个地址具有相同的值,但类型不同。这本身就是未定义的行为。然而绝大多数时候,它的“工作原理”就像正确的 scanf("%s", temp_key); (没有 &)

  2. scanf("%s", temp_key); 对读取的数据量没有限制,如上所述,输入 6 个或更多数字会导致缓冲区溢出,未定义的行为

  3. 未检查返回值,因此代码不知道事情是否成功。 stdin 可能已关闭(不再有输入)或其他问题。

而是使用 fgets() 读取用户输入的并将该输入转换为字符串

#define KEY_N 6
// key \n \0 extra - why be stingy?
char temp_key[KEY_N + 1 + 1 + 10];

//scanf("%s", &temp_key);
if (fgets(temp_key, sizeof temp_key, stdin)) {
// user input successfully read!

temp_key[strcspn(temp_key), "\n"] = '\0'; // lop off potential trailing \n
if (strlen(temp_key) != KEY_N) Handle_Invalid_Input();
else GoodToGo();
}
<小时/>

代码也可能存在其他问题。

例如:二进制 vs 文本模式下的 fp 以及“在 linux 上运行...所以我使用 Visual Studio”对读取出现的“keys.bin”的期望感到担忧就像文本文件一样。目前,只要将 OP 视为二进制文件,OP 正在做的事情看起来就可以。

关于c - 需要有关二进制文件的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47342951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com