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

在C++中如何提取TXT文件指定字段并将城市名存入vector后输出?

解决方法

你的现有代码已经实现了文件读取的基础逻辑,只需要补充行内容拆分和Unicode转义处理两个环节,就可以提取到正确的城市名。

核心逻辑说明

每一行的字段结构固定:

  • 第1个字段:序号(无空格)
  • 第2个字段:国家标签(无空格)
  • 中间字段:城市名(可能包含1-2个单词)
  • 最后2个字段:经纬度坐标(无空格)
    所以拆分后只要取「第2个索引之后、最后2个字段之前」的所有内容拼接,就是完整城市名。

完整可运行代码

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>
#include <cstdint>

// 处理\uXXXX格式的Unicode转义,转换为UTF-8编码
std::string decodeUnicodeEscape(const std::string& input) {
    std::string output;
    size_t length = input.length();
    for (size_t i = 0; i < length; ++i) {
        if (input[i] == '\\' && i + 5 < length && input[i+1] == 'u') {
            // 读取4位16进制Unicode码点
            uint32_t codePoint = 0;
            for (int j = 0; j < 4; ++j) {
                char c = input[i + 2 + j];
                codePoint <<= 4;
                if (c >= '0' && c <= '9') codePoint += c - '0';
                else if (c >= 'a' && c <= 'f') codePoint += 10 + c - 'a';
                else if (c >= 'A' && c <= 'F') codePoint += 10 + c - 'A';
            }
            // 转换为UTF-8编码
            if (codePoint <= 0x7F) {
                output += static_cast<char>(codePoint);
            } else if (codePoint <= 0x7FF) {
                output += static_cast<char>(0xC0 | (codePoint >> 6));
                output += static_cast<char>(0x80 | (codePoint & 0x3F));
            } else if (codePoint <= 0xFFFF) {
                output += static_cast<char>(0xE0 | (codePoint >> 12));
                output += static_cast<char>(0x80 | ((codePoint >> 6) & 0x3F));
                output += static_cast<char>(0x80 | (codePoint & 0x3F));
            }
            i += 5;
        } else {
            output += input[i];
        }
    }
    return output;
}

int main() {
    std::ifstream file("miasta.txt");
    if (!file.is_open()) {
        std::cerr << "文件打开失败" << std::endl;
        return 1;
    }

    std::vector<std::string> cities;
    std::string line;

    // 优化读取逻辑,避免读到多余空行
    while (std::getline(file, line)) {
        if (line.empty()) break;

        std::istringstream iss(line);
        std::vector<std::string> fields;
        std::string field;
        // 拆分当前行所有空白分隔的字段
        while (iss >> field) {
            fields.push_back(field);
        }

        // 拼接城市名:字段索引2到倒数第三个(最后两个是坐标)
        std::string cityName;
        for (size_t i = 2; i < fields.size() - 2; ++i) {
            if (i > 2) cityName += " ";
            cityName += fields[i];
        }

        // 解码Unicode转义后存入列表
        cities.push_back(decodeUnicodeEscape(cityName));
    }

    // 输出结果
    std::cout << "List of cities:" << std::endl;
    for (const auto& city : cities) {
        std::cout << city << std::endl;
    }

    file.close();
    return 0;
}

运行效果

运行后输出的城市列表如下:

Lubochnia
Lubomierz
Lubomino
Łaskarzew
Lubycza Królewska
Łuków

内容的提问来源于stack exchange,提问作者niandra1994

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:39:04