如何从文本文件行中读取可变长度名称并存储为单个字符串?
解决多词物品名称的读取问题
核心思路是利用**每行结构固定(首元素为ID,末两个元素为数值,中间所有内容为物品名称)**的特点,先读取整行内容,再拆分提取各部分,而不是直接用>>按空格分割。
方法一:读取整行后拆分处理
以C++为例,通过拆分整行为字符串数组,按索引提取对应内容,兼容性最强(即使名称含数字也能正常处理):
代码示例
#include <iostream> #include <fstream> #include <sstream> #include <vector> #include <string> using namespace std; struct Item { int id; string name; int val1; int val2; }; int main() { ifstream file("items.txt"); string line; vector<Item> items; while (getline(file, line)) { istringstream iss(line); vector<string> parts; string part; // 将整行按空格拆分为字符串数组 while (iss >> part) { parts.push_back(part); } if (parts.size() >= 4) { // 确保格式合法:至少ID、1词名称、两个数值 Item item; item.id = stoi(parts[0]); // 拼接中间所有部分作为多词名称 for (size_t i = 1; i < parts.size() - 2; ++i) { if (i > 1) item.name += " "; item.name += parts[i]; } item.val1 = stoi(parts[parts.size() - 2]); item.val2 = stoi(parts[parts.size() - 1]); items.push_back(item); } } // 测试输出 for (const auto& item : items) { cout << "ID: " << item.id << ", Name: " << item.name << ", Val1: " << item.val1 << ", Val2: " << item.val2 << endl; } return 0; }
方法二:先读ID,再读取名称直到数值出现
如果能确定物品名称不含数字,可以用更简洁的方式:先读取ID,再读取所有非数字单词拼接成名称,最后读取末尾的两个数值。
代码示例
#include <iostream> #include <fstream> #include <string> #include <cctype> using namespace std; struct Item { int id; string name; int val1; int val2; }; int main() { ifstream file("items.txt"); Item item; string word; while (file >> item.id) { item.name.clear(); // 读取所有非数字单词,直到遇到第一个数值 while (file >> word) { bool isNumber = true; for (char c : word) { if (!isdigit(c)) { isNumber = false; break; } } if (isNumber) { // 将数值单词放回输入流,供后续读取 file.seekg(-(int)(word.size() + 1), ios::cur); break; } if (!item.name.empty()) item.name += " "; item.name += word; } // 读取末尾的两个数值 file >> item.val1 >> item.val2; // 输出当前物品信息 cout << "ID: " << item.id << ", Name: " << item.name << ", Val1: " << item.val1 << ", Val2: " << item.val2 << endl; } return 0; }
注意事项
- 若名称可能包含数字,优先使用方法一,避免识别错误;
- 处理前需确保每行格式符合要求,避免数组越界或读取异常。
内容的提问来源于stack exchange,提问作者dailypassby
相关产品推荐
相关产品推荐

