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

C++读取pliki.txt二进制数统计可被2、8整除数量异常求助

解决二进制数字统计被2/8整除结果始终为0的问题

我碰到过好几次类似的问题,大概率是字符串读取或末尾判断的细节没处理好,导致你的逻辑根本没匹配到正确的二进制位。下面是几个最可能的原因和对应的修复方法:

1. 读取时混入了空白字符(最常见!)

如果你的文件里每个二进制数字占一行,读取时很容易把换行符\n或者回车符\r一起读进来。这时候你判断最后一位是'0'的话,实际拿到的是换行符,自然匹配失败,统计结果全是0。

修复方法:

读取每个字符串后,先去掉首尾的空白字符。比如在C++里可以写个简单的trim函数:

#include <algorithm>
#include <cctype>

void trim(std::string &s) {
    // 去掉开头空白
    s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char c) {
        return !std::isspace(c);
    }));
    // 去掉结尾空白
    s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char c) {
        return !std::isspace(c);
    }).base(), s.end());
}

每次读取完二进制字符串后,先调用trim(bin_str),再进行后续判断。

2. 末尾判断的字符匹配错了

你是不是把判断写成了最后一位 == 0?这里要注意,二进制字符串里的0是字符'0'(ASCII码48),而数字0是ASCII码0(空字符),这俩完全不一样!

正确的判断逻辑:

int licz_dwa = 0, licz_osiem = 0;
std::string bin_str;
std::ifstream file("pliki.txt");

while (std::getline(file, bin_str)) {
    trim(bin_str);
    if (bin_str.empty()) continue; // 跳过空行

    // 判断能被2整除:最后一位是字符'0'
    if (bin_str.back() == '0') {
        licz_dwa++;
    }

    // 判断能被8整除:最后三位是"000",或者字符串本身是"0"(特殊情况)
    if (bin_str.size() >= 3) {
        if (bin_str.substr(bin_str.size() - 3) == "000") {
            licz_osiem++;
        }
    } else {
        // 长度不足3时,只有全0的二进制数(也就是"0")能被8整除
        if (bin_str == "0") {
            licz_osiem++;
        }
    }
}

std::cout << licz_dwa << " " << licz_osiem << std::endl;

3. 文件读取方式不对

如果用cin >> bin_str读取,虽然会自动跳过空格,但如果文件里有空白行或者特殊编码(比如UTF-8 BOM开头),可能会读取到空字符串或者异常字符。换成getline逐行读取,再trim处理会更稳妥。

快速排查技巧

可以在读取后加一行打印,看看实际读到的内容是什么:

std::cout << "当前字符串:[" << bin_str << "]" << std::endl;

如果输出里看到[1010\n]或者[ 1100 ]这种带空格/换行的,那就是空白字符的问题,直接用trim解决就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:54:36