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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:57:03