You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何使用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;
}

编译运行步骤

  1. 编译代码:gcc main.c -o main
  2. 运行程序:./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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:05:37