C语言向output.txt写入字符串出现异常乱码符号问题求助
问题根因
写入文件出现大量异常符号、逻辑不符合预期,是代码里三个明显错误导致的:
- 写入长度错误:调用
write(fd, str, sizeof(str))时,sizeof(str)取的是str数组的固定大小20字节,无论用户输入的字符串实际多长,每次都会固定写入20字节。比如输入"first"仅占5个有效字符+1个字符串结束符共6字节,剩余14字节是str数组未初始化的栈内存随机值,这些值写到文件里就是你看到的乱码符号。 - 退出逻辑写反:
strcmp(str1, str2)的返回规则是两串相等返回0、str1大于str2返回正数、str1小于str2返回负数。当前代码判断result>=0就写入,意味着输入"-1"时返回值为0,反而会被当成有效内容写入,只有输入字符串ASCII码小于"-1"时才会触发退出,完全不符合设计预期。 - 文件打开逻辑冗余且存在隐患:先调用
open尝试打开,失败后再用fopen创建文件、再重新open拿文件描述符的写法完全多余,且没有做创建失败的异常处理;同时打开文件时没加O_APPEND标志,多次写入不会自动追加到文件末尾,会出现内容覆盖问题,也没有给新建文件配置访问权限。
修正后的可运行代码
#include<stdio.h> #include<unistd.h> #include<fcntl.h> #include <string.h> int main() { int fd; char str[20]; // 打开文件:读写模式、不存在则创建、写入追加到末尾,新建文件权限设为644 fd = open("output.txt", O_RDWR | O_CREAT | O_APPEND, 0644); if (fd == -1) { perror("open file failed"); return 1; } while(1){ printf("Enter String: \n"); // 限制读取最大长度为19,预留1位存字符串结束符,避免数组越界 scanf("%19s", str); // 输入为-1时退出循环 if(strcmp(str, "-1") != 0){ // 按字符串实际长度写入,不写入数组冗余空间 write(fd, str, strlen(str)); // 追加换行符分隔不同输入内容 write(fd, "\n", 1); printf(" %s was written to output.txt \n", str); }else{ break; } } // 关闭文件描述符,释放资源 close(fd); return 0; }
关键修改说明
- 写入长度从固定
sizeof(str)改为strlen(str),仅写入用户输入的有效字符,从根源解决乱码问题 - 修正
strcmp判断逻辑,输入"-1"时正常退出循环,不会把退出指令写入文件 - 简化文件打开逻辑,直接通过
open的O_CREAT标志实现不存在即创建,加O_APPEND保证内容追加不覆盖,配置合理的文件权限,增加打开失败的错误提示 - 给
scanf增加读取长度限制,避免用户输入过长导致数组越界 - 操作完成后主动关闭文件描述符,避免资源泄漏
- 每次写入后追加换行符,不同输入内容在文件内分行存储,可读性更强
内容的提问来源于stack exchange,提问作者paradus-hex
相关产品推荐
相关产品推荐

