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
相关产品推荐
相关产品推荐

