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

C++如何从文件读取字节?将桌面TXT文件字节读入数组

关于读取文件字节到数组的疑问解答

首先得说,你当前的读取代码其实存在不少问题,这也是你疑惑“从string读取字节和直接从文件读取是否等效”的根源之一,咱们一步步来拆解:

你的现有代码的问题

  • 使用>>运算符读取会自动跳过所有空白字符(空格、换行符、制表符等),这意味着原文件里的空格、换行这些字节根本没被读到file_text里,你的string内容已经和原文件不一致了
  • 手动维护word_buffer缓冲区不仅麻烦,还容易出现边界问题(比如如果某个单词长度超过30,就会溢出)
  • while (File.eof() == false)的判断时机不对,eof标志是在读取失败后才会设置,所以可能会导致最后一次循环多读一次无效数据

核心疑问:从string读取字节和直接从文件读取是否等效?

答案是:如果你的string完整保存了文件的所有字节(包括空白字符、二进制数据等),那两者完全等效;但如果你的string丢失了部分字节(比如你现在的代码),那肯定不等效。

也就是说,关键在于你是否把文件的每一个字节都准确读到了string里,只要做到这一点,从string复制字节和直接从文件读字节是没有区别的。

正确的实现方式

方式一:先完整读取到string,再转存到数组

要完整读取文件的所有字节,需要用二进制模式打开文件(避免文本模式下的换行转换,比如Windows下\r\n被转成\n),然后用迭代器一次性读取:

#include <fstream>
#include <string>
#include <iterator>

int main() {
    // 用二进制模式打开文件,确保所有字节都被原样读取
    std::ifstream File("C:\\Users\\Flone\\Desktop\\ass.txt", std::ios::binary);
    if (!File.is_open()) {
        // 处理文件打开失败的情况
        return 1;
    }

    // 一次性读取所有内容到string
    std::string file_text((std::istreambuf_iterator<char>(File)), std::istreambuf_iterator<char>());
    File.close();

    // 现在把string的内容复制到数组里
    // 可以用动态数组,或者根据string长度分配空间
    char* byte_array = new char[file_text.size()];
    std::memcpy(byte_array, file_text.data(), file_text.size());

    // 使用byte_array...

    // 记得释放内存
    delete[] byte_array;
    return 0;
}

方式二:直接从文件读取到数组

如果不想经过string这一步,也可以直接读取到数组:

#include <fstream>
#include <iostream>

int main() {
    std::ifstream File("C:\\Users\\Flone\\Desktop\\ass.txt", std::ios::binary | std::ios::ate);
    if (!File.is_open()) {
        return 1;
    }

    // 获取文件大小(ios::ate会把指针移到文件末尾,tellg()得到当前位置即文件大小)
    std::streampos file_size = File.tellg();
    File.seekg(0, std::ios::beg); // 把指针移回文件开头

    // 分配数组空间
    char* byte_array = new char[file_size];
    if (!byte_array) {
        File.close();
        return 1;
    }

    // 读取所有字节到数组
    File.read(byte_array, file_size);
    File.close();

    // 使用byte_array...

    delete[] byte_array;
    return 0;
}

总结

只要保证string完整包含了文件的每一个字节,那么从string读取字节和直接从文件读取是完全等效的;但你的原始代码因为读取方式的问题丢失了部分字节,所以才会产生疑惑。建议用上面的两种正确方式来实现需求。

内容的提问来源于stack exchange,提问作者Flone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:25:24