使用 fwrite 存储在文本文件中的数据在 C 中不可读
Data stored in text file using fwrite is unreadable in C
当使用 fwrite 将数据存储在文本文件中时,就像这样,其中 t 是一个结构:
fwrite(&t, sizeof(t), 1, fptr);
文本文件中的输出结果为:
楷獬湯찀쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌敷敷
(以上为示例,并非完整输出)
为什么会这样?
编辑:t 是一个结构 - 提示用户输入两个字符串,用户名和密码。这是一个基本模板 - 这是一个遇到问题的朋友,我没有实际的代码片段可以分享,但我认为它与此等效。我知道这不是很有帮助,对此感到抱歉。感谢任何帮助。
struct details {
char username[32], password[32];
}
int main() {
struct details t;
scanf("%s",t.username);
scanf("%s",t.password);
}
文件以+模式打开。
Edit2: 运行 朋友的代码,用新文件初始化结构,输入用户名和密码为“0”。这是十六进制转储。
file name: admins.txt
mime type:
0000-0010: 30 00 cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc 0....... ........
0000-0020: cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc ........ ........
0000-0030: cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc ........ ........
0000-0040: cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc ........ ........
0000-0050: cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc ........ ........
0000-0060: 30 00 cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc 0....... ........
0000-0070: cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc ........ ........
0000-0080: cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc ........ ........
0000-0090: cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc ........ ........
0000-00a0: cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc ........ ........
用户输入的是Unicode字符串吗?将结构初始化为全零。粘贴文件的 hexdump。
阅读 fwrite. It is for binary IO 的文档。但是你有一个文本格式。
你可以考虑parsing your textual file. Learn about fgets, sscanf,等等...
也考虑使用现有的文本格式,例如 JSON, YAML, etc... You'll find many libraries for them (e.g. jansson in C)。
既然您对汉字感兴趣(或正在观察),请阅读Utf8 Everywhere。
此外,编译您的代码with all warnings and debug info (e.g. gcc -Wall -Wextra -g
with GCC) and learn how to use the gdb
debugger to understand the behaviour of your program. You might use watchpoints以了解何时写入位置。
阅读更多关于 undefined behavior and be 的信息(垃圾文件内容可能是 UB 的影响,但可能更糟)。
当使用 fwrite 将数据存储在文本文件中时,就像这样,其中 t 是一个结构:
fwrite(&t, sizeof(t), 1, fptr);
文本文件中的输出结果为:
楷獬湯찀쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌敷敷
(以上为示例,并非完整输出)
为什么会这样?
编辑:t 是一个结构 - 提示用户输入两个字符串,用户名和密码。这是一个基本模板 - 这是一个遇到问题的朋友,我没有实际的代码片段可以分享,但我认为它与此等效。我知道这不是很有帮助,对此感到抱歉。感谢任何帮助。
struct details {
char username[32], password[32];
}
int main() {
struct details t;
scanf("%s",t.username);
scanf("%s",t.password);
}
文件以+模式打开。
Edit2: 运行 朋友的代码,用新文件初始化结构,输入用户名和密码为“0”。这是十六进制转储。
file name: admins.txt
mime type:
0000-0010: 30 00 cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc 0....... ........
0000-0020: cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc ........ ........
0000-0030: cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc ........ ........
0000-0040: cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc ........ ........
0000-0050: cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc ........ ........
0000-0060: 30 00 cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc 0....... ........
0000-0070: cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc ........ ........
0000-0080: cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc ........ ........
0000-0090: cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc ........ ........
0000-00a0: cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc ........ ........
用户输入的是Unicode字符串吗?将结构初始化为全零。粘贴文件的 hexdump。
阅读 fwrite. It is for binary IO 的文档。但是你有一个文本格式。
你可以考虑parsing your textual file. Learn about fgets, sscanf,等等...
也考虑使用现有的文本格式,例如 JSON, YAML, etc... You'll find many libraries for them (e.g. jansson in C)。
既然您对汉字感兴趣(或正在观察),请阅读Utf8 Everywhere。
此外,编译您的代码with all warnings and debug info (e.g. gcc -Wall -Wextra -g
with GCC) and learn how to use the gdb
debugger to understand the behaviour of your program. You might use watchpoints以了解何时写入位置。
阅读更多关于 undefined behavior and be