求助:如何使用write()函数将结构体写入文件并输出指定明文内容?
问题根源:你写的是指针地址,不是字符串内容!
嘿,我一眼就瞅出乱码的问题所在了:你的Person结构体里的name、lastName、age都是指针类型。当你用write()直接把整个结构体写入文件时,实际上存进文件的是这些指针指向的内存地址(比如类似0x7ffeefbff5a0的十六进制值),而不是"John"、"Doe"、"45"这些你真正想保存的字符串内容——这些地址值在文件里显示出来自然就是乱码啦。
解决方案:用write()逐个写入字符串内容
既然要求必须用write(),那我们不能直接写结构体本身,得手动把每个字符串的内容(加上分隔用的空格)依次写入文件。具体怎么做呢?看下面的步骤和代码:
完整修正代码
#include <unistd.h> #include <fcntl.h> #include <string.h> #include <stdlib.h> struct Person{ char* name; char* lastName; char* age; }; int main(int argc, char** argv){ // 先检查命令行参数数量是否正确 if(argc != 5){ write(STDERR_FILENO, "用法: ./main output.dat <名字> <姓氏> <年龄>\n", 45); exit(EXIT_FAILURE); } struct Person human; // 把命令行参数赋值给结构体成员 human.name = argv[2]; human.lastName = argv[3]; human.age = argv[4]; // 打开输出文件:只写模式,不存在则创建,存在则清空原有内容 int fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0644); if(fd == -1){ write(STDERR_FILENO, "打开文件失败!\n", 13); exit(EXIT_FAILURE); } // 依次写入每个部分,别忘了加空格分隔 write(fd, human.name, strlen(human.name)); write(fd, " ", 1); write(fd, human.lastName, strlen(human.lastName)); write(fd, " ", 1); write(fd, human.age, strlen(human.age)); // 加个换行符,让文件内容更整洁(可选) write(fd, "\n", 1); // 别忘了关闭文件描述符 close(fd); return 0; }
编译运行步骤
- 编译代码:
gcc main.c -o main - 运行程序:
./main output.dat John Doe 45
现在打开output.dat,里面就是你想要的John Doe 45(如果加了换行就是带换行的版本)。
额外唠两句:如果非要写入结构体对象?
要是你铁了心要把整个结构体写入文件,那得把结构体里的指针改成字符数组,这样write()写入的就是实际内容。比如:
struct Person{ char name[50]; char lastName[50]; char age[10]; };
然后用strcpy()把命令行参数的字符串拷贝到数组里,再用write(fd, &human, sizeof(struct Person))写入。不过这种方式会把数组里没用到的空间也写入文件(比如name数组只存了"John",剩下的46个字节会是垃圾值),所以不如直接写字符串内容来得干净,更贴合你期望的输出效果。
内容的提问来源于stack exchange,提问作者morty
相关产品推荐
相关产品推荐

