C语言创建文件后读取失败求助:写入后无法读取内容
问题分析与解决建议
你的代码存在两个核心问题,直接导致读取操作失败:
1. 文件打开模式错误
creat() 函数创建文件时,是以只写模式(O_WRONLY | O_CREAT | O_TRUNC)打开的,此时文件描述符不支持读取操作,调用read()会直接失败,返回值n为-1。
2. 读取缓冲区未正确初始化
char* c是一个未初始化的指针,没有指向任何有效内存空间。你调用read(fd, &c, 4)时,实际是把读取内容写入了指针变量c本身的内存地址,属于非法内存访问,会触发未定义行为。
修正后的代码示例
#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <stdlib.h> int main(){ int fd, n; // 用栈上数组作为读取缓冲区,预留字符串结束符位置 char c[5]; // 用open()指定可读可写模式,同时实现创建/截断文件功能 fd = open("as.txt", O_RDWR | O_CREAT | O_TRUNC, 0666); if (fd == -1) { perror("open failed"); exit(EXIT_FAILURE); } write(fd, "hola", 4); // 将文件指针移到文件开头 lseek(fd, 0, SEEK_SET); n = read(fd, c, 4); if (n == -1) { perror("read failed"); close(fd); exit(EXIT_FAILURE); } // 添加字符串结束符,避免打印乱码 c[n] = '\0'; printf("Read: %d, Content: %s\n", n, c); close(fd); // 关闭文件描述符,避免资源泄漏 return 0; }
关键修正说明
- 替换
creat()为open(),指定O_RDWR模式,让文件同时支持读写操作。 - 使用栈上字符数组
char c[5]作为缓冲区,或用malloc()动态分配内存,确保有合法存储空间存放读取内容。 - 增加
open()、read()的错误检查,便于快速定位问题。 - 读取后添加
'\0'字符串结束符,保证打印内容的正确性。 - 操作完成后调用
close()关闭文件描述符,避免系统资源泄漏。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

