c - 胡乱使用 *nix API 会导致文本文件出现乱码

标签 c linux api unix

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>

int main () {
        char grade[5];
        char name[30];

        int fd = creat("notas.txt", 0644);

        if (fd == -1) {
            perror("notas.txt");
            return 1;
        }


        while (1) {
            scanf("%s %s", name, grade);
            if (strcmp(name, "end") != 0) {
                write(fd, name, 30);
                write(fd, "\t", 1);
                write(fd, grade, 5);
                write(fd, "\n", 1);
            } else {
                close(fd);
                return 0;
            }
        }

}

大家好。我正在尝试进入 *nix 内核 API 编程,并且我编写了上面的程序。它从命令行读取姓名和成绩,然后将它们写入文件。然而,该文件是乱码,我只能cat它(不能用文本编辑器打开)并且我的数据出现在一堆乱码的随机字符中。 cat 文件后,我的提示符还有一堆前导随机字符,如 1C2;1C3(...)。

为什么会这样?

谢谢大家

最佳答案

write() 将字节写入文件,而不是特定的字符串。 write() 的第三个参数是要写入的字节数。 write(fd, name, 30) 这样就向文件写入了 30 个字节,但是 name 中的字符串较短,所以一堆随机字符恰好在内存中写入文件。

在C语言中,字符串的长度是通过在字符串末尾放置一个nul字符('\0',即0)来表示的,可以用来检查strlen()函数,所以需要这样写write(fd, name, strlen(name))

关于c - 胡乱使用 *nix API 会导致文本文件出现乱码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5166828/

相关文章:

c - 在 int 数组上使用 memcmp 是否严格符合要求?

python - 在Flask中使用render_template,如何将字符串拆分为多行?

javascript - 如何使用 Jquery REST API 在物联网上发送消息?

rest - 在Flutter中使用Rest API获取用户数据

C 预处理器宏 - 基于参数串联的条件

找不到在 c 中解析我的 json 的方法

c++ - 如何在 C/C++ 中存储和调用已编译的函数?

linux - Bash 脚本中 FTP 将文件复制到远程计算机失败

linux - VIM 问题 : When a . swp文件存在,是否可以添加一个 "(D)elete"选项

linux - OpenGL 颜色/alpha 输出略微变暗