C++读取txt文件输出结果不符合预期的问题咨询
解决C++读取带空格的文本内容分割问题
嘿,这个问题我太熟啦!你遇到的核心问题在于C++里的>>输入运算符是按空白字符(空格、换行、制表符等)分割输入的,它会把你的文本1 Fish Dish:Fish and chips拆成以下几个部分:
1→ 赋值给itemNoFish→ 赋值给categoryDish:Fish→ 赋值给descript
剩下的and和chips还留在输入缓冲区里没被读取,这就导致了你的输出和预期不符。
下面给你两种可靠的解决方案,都是针对数字 分类:描述这种固定格式的:
方案一:先读数字,再读整行分割冒号
这种方法先把数字单独读出来,再读取整行剩余内容,最后通过冒号分割分类和描述:
#include <iostream> #include <fstream> #include <string> #include <limits> using namespace std; int main() { int itemNo; string line; string category, descript; ifstream infile("menu.txt"); // 先读取数字,此时数字后的空格/换行会留在缓冲区 infile >> itemNo; // 忽略掉数字后面的所有空白字符,直到遇到换行符 infile.ignore(numeric_limits<streamsize>::max(), '\n'); // 读取整行剩余内容,拿到完整的"Fish Dish:Fish and chips" getline(infile, line); // 找到冒号的位置,分割字符串 size_t colonPos = line.find(':'); if (colonPos != string::npos) { category = line.substr(0, colonPos); descript = line.substr(colonPos + 1); } else { // 处理没有冒号的异常情况 cerr << "格式错误:未找到冒号分隔符" << endl; return 1; } cout << category << " - " << descript << " - " << itemNo << '\n'; return 0; }
方案二:用字符串流处理整行内容
这种方法先读取整行,再用istringstream把整行内容转换成输入流,灵活分割内容:
#include <iostream> #include <fstream> #include <string> #include <sstream> using namespace std; int main() { int itemNo; string line, tempPart; string category, descript; ifstream infile("menu.txt"); // 读取整行文本 getline(infile, line); istringstream lineStream(line); // 先读取数字 lineStream >> itemNo; // 读取直到冒号的部分(包含分类里的空格) getline(lineStream, tempPart, ':'); // tempPart开头会有一个空格,去掉它 category = tempPart.substr(1); // 读取冒号后面的所有内容作为描述 getline(lineStream, descript); cout << category << " - " << descript << " - " << itemNo << '\n'; return 0; }
这种方法的优势是不需要手动处理输入缓冲区的空白,字符串流会帮你处理大部分细节。
两种方案都能输出你预期的结果:Fish Dish - Fish and chips - 1,如果你的menu.txt有多行内容,只需要把读取逻辑放在循环里即可。
内容的提问来源于stack exchange,提问作者bon123
相关产品推荐
相关产品推荐

