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
相关产品推荐
相关产品推荐

