在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
相关产品推荐
相关产品推荐

