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

如何从文本文件行中读取可变长度名称并存储为单个字符串?

解决多词物品名称的读取问题

核心思路是利用**每行结构固定(首元素为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 23:31:24