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

std::ifstream.get()是否捕获换行符?银行家算法项目文件读取异常求助

问题解答

1. std::ifstream.get()的行为确认

std::ifstream.get(char& ch)属于无格式输入函数,会读取包括换行符\n、制表符\t在内的所有字符,仅在流到达末尾(EOF)或发生IO错误时返回失败,问题确实出在get()的用法上。

2. 异常原因分析

你的代码存在两个核心逻辑错误:

  • 输入文件中每行末尾的数字后是换行符而非空格,不同矩阵之间还有空行(连续换行符),你设定的循环终止条件仅判断是否为空格,导致程序会把换行符直接拼接进数字字符串,同时提前读取走下一行的首个数字字符,最终出现矩阵读取结果错乱。
  • 文件末尾的最后一个数字后没有空格,当程序读取到文件末尾时,会因为永远等不到空格进入死循环,这就是你把所有数据放同一行后,读取最大矩阵仍然卡住的原因。

3. 修复方案

最优方案:使用流提取运算符简化逻辑

C++的流提取运算符>>默认会自动跳过所有空白字符(空格、换行、制表符、连续空行),不需要手动处理分隔符,代码可直接简化为:

// 读取可用资源数组
for (int r = 0; r < R; ++r) {
    input >> avail_[r];
}

// 读取已分配资源矩阵
for (int p = 0; p < P; ++p) {
    for (int r = 0; r < R; ++r) {
        input >> alloc_[p][r];
    }
}

// 读取最大资源矩阵
for (int p = 0; p < P; ++p) {
    for (int r = 0; r < R; ++r) {
        input >> max_[p][r];
    }
}

该方案完全适配你给出的输入文件结构,不需要对输入格式做任何调整。

可选方案:保留get()的修改方式

如果必须使用get()实现,需要引入<cctype>头文件的isspace()方法判断所有空白字符,同时增加流有效性判断避免死循环:

#include <cctype>

// 示例:读取可用资源数组的单元素逻辑
for (int r = 0; r < R; ++r) {
    char in;
    // 跳过所有前导空白字符
    do {
        if (!input.get(in)) goto end_read; // 读取失败直接终止所有读取逻辑
    } while (isspace(in));
    
    std::string numStr;
    // 读取直到遇到下一个空白字符
    do {
        numStr += in;
        if (!input.get(in)) break;
    } while (!isspace(in));
    
    avail_[r] = std::stoi(numStr);
}
end_read:
// 后续矩阵读取逻辑和上述结构一致

内容的提问来源于stack exchange,提问作者D.Ward

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:57:03