C++用POSIX调用读文件存char*数组输出内容不全是大小计算错了吗
问题原因分析
你计算文件大小的逻辑没有错误,问题出在读取内容和字符串输出的处理逻辑上:
- 错误使用
sizeof(array)获取读取长度:array是char*类型的指针,sizeof()返回的是指针本身的内存占用大小(64位系统为8字节、32位系统为4字节),不是你申请的数组总长度。你写的sizeof(array)-1实际只会读取最多7字节内容,所以最终只输出了开头的This is。 - 未给字符串补结束符:
cout输出char*类型时依赖末尾的\0判断结束位置,你申请的数组长度和文件大小完全一致,没有预留\0的存储位置,也没有手动添加结束符,会导致输出越界、出现乱码的问题。 - 缺少文件打开失败的判断逻辑:如果指定文件不存在、无读取权限,
open会返回-1,后续操作会直接崩溃。
修复后代码
#include "iostream" #include <fcntl.h> #include <unistd.h> #include <errno.h> using namespace std; int main() { const char* name = "test.txt"; int fd = open(name, O_RDONLY); // 新增文件打开失败判断 if (fd < 0) { cout << "open file failed, errno:" << errno << endl; return -1; } off_t length = lseek(fd, 0, SEEK_END); cout << "file size: " << length << endl; // 多申请1字节,预留\0的位置 char* array = new char[length + 1]; lseek(fd, 0, SEEK_SET); // 重置文件指针到起始位置 // 读取长度改为实际文件大小length ssize_t read_len = read(fd, array, length); // 手动补字符串结束符 array[read_len] = '\0'; cout << array << "finished" << endl; close(fd); delete[] array; return 0; }
内容的提问来源于stack exchange,提问作者yambo
相关产品推荐
相关产品推荐

