C++读取多行格式化文件存入struct 仅获取第一条数据问题排查
问题产生原因
核心问题出在两种输入读取方式的换行符处理逻辑差异上:
- 使用
>>读取price数值时,运算符只会读取数字字符,会把数值末尾的换行符残留在文件输入流的缓冲区中 - 下一轮循环执行
getline时,会直接读取到缓冲区中残留的换行符,得到空字符串作为下一个菜品的描述,后续再用>>读取价格时会匹配到实际的菜名字符串,类型不匹配导致输入流进入错误状态,后续所有读取操作都会直接失败
额外存在逻辑隐患:eof()是在读取操作失败触发文件末尾标记后才会返回真,提前判断!inFile.eof()不能保证后续读取操作一定成功,容易读取到无效数据。
修复方案
- 每次读取完价格后,主动清空输入流缓冲区中残留的换行符及后续空白字符
- 调整循环判断逻辑,直接以读取操作的返回值作为是否继续执行的判断依据,避免提前判断eof的问题
- 补充文件打开的路径参数(当前代码中
inFile.open()没有传入目标文件路径,属于遗漏逻辑)
修复后的参考代码:
#include <limits> // 需包含该头文件使用numeric_limits void getData(MenuItem menuList[], int &size) { // 替换为实际的菜单文件路径 inFile.open("menu.txt"); size = 0; // 初始化size避免脏数据 for(int i = 0; i < 8; i++) { // 直接判断读取是否成功,失败则终止循环 if(!getline(inFile, menuList[i].description)) break; if(!(inFile >> menuList[i].price)) break; menuList[i].quantity = 0; size++; // 忽略当前行剩余所有字符直到换行,清空缓冲区残留的换行符 inFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } // 读取完成后关闭文件 inFile.close(); }
内容的提问来源于stack exchange,提问作者Noah Valentine
相关产品推荐
相关产品推荐

