You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:24:05