C++实现文本文件内容转bin/hex/dec时换行及转换功能异常求解
问题原因排查
1. 程序无法正确跳转处理下一行的原因
- 混淆了标准输入
cin和文件输入file的逻辑:标记本身是存储在文本文件里的,但代码中用cin >> letter读取标记,会导致程序卡在控制台等待用户手动输入,根本不会读取文件内的标记行,自然无法正常处理后续内容。 getline和>>混用存在换行符残留问题:file >> n这类操作只会读取数字内容,不会吃掉行尾的换行符,下一次执行getline时只会读到空行,直接导致行处理逻辑错乱。- 变量未循环重置:
decimal、i这类临时变量仅在进入循环前初始化了一次,处理完第一组内容后值不会清零,后续所有转换的结果都会被之前的数值污染。 - 处理顺序错误:代码先打印了当前行的内容,才判断是不是标记行,完全颠倒了逻辑,应该先判断当前行是否为标记,再读取下一行的待转换内容处理。
2. 自定义转换函数无法正常完成转换的原因
- 二进制转换逻辑错误:把二进制字符串当成长整型
n读入,一旦二进制串长度超过长整型存储上限就会直接溢出,且用pow计算2的幂次存在浮点精度误差,会导致计算结果偏差。 - 十六进制转十进制的
hexi函数仅支持大写字母A-F,不支持小写a-f,如果输入存在小写字符就会漏算,且返回值为int类型,数值稍大就会溢出。 - 缺失二进制转十六进制的逻辑:现有代码只写了二进制转十进制的部分,根本没有实现转十六进制的逻辑,自然输出不了正确的十六进制结果。
- 输出逻辑错误:还没有执行转换操作就先打印了
Binary、Hex、decimal的初始值,这些值默认是空或者0,输出内容自然全部错误。
修复参考实现
#include <iostream> #include <fstream> #include <string> #include <algorithm> using namespace std; // 二进制字符串转十进制 long long bin2dec(const string& bin) { long long res = 0; for (char c : bin) { res = res * 2 + (c - '0'); } return res; } // 十进制转十六进制字符串 string dec2hex(long long dec) { const string hex_digits = "0123456789ABCDEF"; if (dec == 0) return "0"; string res; while (dec > 0) { res += hex_digits[dec % 16]; dec /= 16; } reverse(res.begin(), res.end()); return res; } int main() { // 替换为你的输入文件路径 ifstream file("C:\\Users\\18059\\source\\repos\\translation\\input.txt"); if (!file.is_open()) { cout << "文件打开失败" << endl; return 1; } string line; while (getline(file, line)) { // 跳过空行 if (line.empty()) continue; // 匹配二进制标记 if (line == "B") { string bin_str; // 读取下一行的二进制内容 if (getline(file, bin_str) && !bin_str.empty()) { long long dec_val = bin2dec(bin_str); string hex_val = dec2hex(dec_val); cout << "原二进制值:" << bin_str << endl; cout << "十进制:" << dec_val << endl; cout << "十六进制:" << hex_val << endl << endl; } } // 其他标记H、D的逻辑可按照相同逻辑补充 } file.close(); return 0; }
内容的提问来源于stack exchange,提问作者Forevar Aloen
相关产品推荐
相关产品推荐

