为何输出前数据被清除?C++代码文件无输出问题求助
问题分析与修复方案
核心问题:无限死循环导致程序卡死
你的retrieve函数里存在无限死循环,这是导致没有任何输出的直接原因:
while (i < c.length()) { i = 0; // 每次循环都把i重置为0,循环条件永远成立 // ... 其他代码 }
这个循环会一直执行,程序根本走不到生成v_Temp、返回结果以及后续输出的步骤,自然看不到任何打印或文件写入。
次要问题:文件流未做有效性检查
在recollect函数中创建输出文件流时,没有检查文件是否成功打开:
ofstream out {filename_str.c_str(), std::ios_base::out | std::ios_base::trunc };
如果文件名无效、路径不存在或者没有写入权限,文件流会打开失败,后续的写入操作会静默失败,不会有任何提示。
额外逻辑问题:二进制字符串处理错误
retrieve中生成v_Temp的代码逻辑有误:
v_Temp += (char)(bitset<8>(section_str.substr(0,8%(section_str.length()+1)))).to_ulong();
8%(section_str.length()+1)会导致当section_str长度为7时,取0个字符(8%8=0),无法正确提取8位二进制字符串转换为字符,最终生成的v_Temp可能为空。
修复步骤
修复无限死循环
移除循环内的i = 0;,改为根据每次处理的二进制位数递增i。比如你每次处理8+12=20位,那么:while (i < c.length()) { // 移除i=0; uint16_t B = bitset<8>(c.substr(i,8)).to_ulong(); // 从i位置开始取8位 space_bin = bitset<8>(B).to_ulong(); i +=8; // 移动指针 while (space_bin > 0) { section_str += bitset<8>(0).to_string(); space_bin--; } cout << "??" << flush; B = bitset<12>(c.substr(i,12)).to_ulong(); // 从i位置开始取12位 section_str += bitset<12>(B).to_string(); i +=12; // 移动指针,总共前进20位 }添加文件打开检查
在创建输出流后,立即检查是否打开成功:ofstream out {filename_str.c_str(), std::ios_base::out | std::ios_base::trunc }; if (!out.is_open()) { cerr << "无法打开输出文件: " << filename_str << endl; return false; }修正二进制字符串转换逻辑
替换v_Temp的生成代码,确保每次正确提取8位(或剩余位数)的二进制字符串:string v_Temp = ""; while (section_str.length() > 0) { size_t take = min((size_t)8, section_str.length()); bitset<8> bits(section_str.substr(0, take)); v_Temp += (char)bits.to_ulong(); section_str = section_str.substr(take); }
内容的提问来源于stack exchange,提问作者Anthony Pulse
相关产品推荐
相关产品推荐

