C语言文件IO与缓冲区操作无输出问题的技术咨询
代码问题排查与修复
你的代码无法完成预期操作,主要有以下几个问题:
write写入长度错误:
write(fd, "it works\n", 300);第三个参数指定写入300字节,但"it works\n"实际只有9个有效字符(包含换行符),这样会写入字符串之后的垃圾内存数据,属于未定义行为。应该使用字符串实际长度,比如strlen("it works\n")或者直接写9。文件偏移指针未重置:调用
write后,文件的读写指针会停在写入内容的末尾,此时直接调用read会从文件末尾开始读,自然读不到任何内容。需要在read之前用lseek(fd, 0, SEEK_SET)将指针移回文件开头。未检查系统调用返回值:
open、malloc、write、read这些系统调用都可能执行失败(比如文件权限不足、内存分配失败),不检查返回值会导致后续错误操作,比如open失败返回-1,后续的write/read都会无效。malloc分配的内存未初始化:
malloc分配的内存是未初始化的垃圾值,如果读取失败,后续写入控制台和text2的就是这些垃圾数据,建议用memset初始化缓冲区。
修复后的代码示例:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <string.h> int main() { int fd, fz; char *buff; const char *msg = "it works\n"; ssize_t write_len, read_len; // 打开文件并检查返回值 fd = open("./text", O_CREAT | O_APPEND | O_RDWR, 0644); if (fd == -1) { perror("open text failed"); return 1; } fz = open("./text2", O_CREAT | O_APPEND | O_RDWR, 0644); if (fz == -1) { perror("open text2 failed"); close(fd); return 1; } // 分配内存并初始化 buff = malloc(sizeof(char) * 300); if (!buff) { perror("malloc failed"); close(fd); close(fz); return 1; } memset(buff, 0, 300); // 写入正确长度的内容 write_len = write(fd, msg, strlen(msg)); if (write_len == -1) { perror("write to text failed"); free(buff); close(fd); close(fz); return 1; } // 重置文件指针到开头 if (lseek(fd, 0, SEEK_SET) == -1) { perror("lseek failed"); free(buff); close(fd); close(fz); return 1; } // 读取内容并检查长度 read_len = read(fd, buff, 300); if (read_len == -1) { perror("read from text failed"); free(buff); close(fd); close(fz); return 1; } // 输出到控制台和text2 write(STDOUT_FILENO, buff, read_len); write(fz, buff, read_len); // 释放资源 free(buff); close(fd); close(fz); return 0; }
内容的提问来源于stack exchange,提问作者Oyeniran Samuel Sanmi
相关产品推荐
相关产品推荐

