C++如何从结构化文本文件读取数值并转换为double变量使用?
C++ 文本读取逻辑实现方案
原代码问题修正点
- 原空行/注释行的判断逻辑写反,调整为匹配到空行或
#开头的行直接跳过 - 替换了错误的
!infile.eof()循环条件,直接以std::getline的返回值作为循环判断,避免最后一行重复读取的问题 - 修正了字符串匹配的逻辑:直接读取第一个字段作为角色名对比,比
find匹配更严谨,不会出现子串误匹配的问题
完整实现代码
需要先引入<sstream>头文件,使用字符串输入流自动处理空格分割、类型转换:
#include <fstream> #include <iostream> #include <string> #include <sstream> // 必须引入该头文件使用字符串流 void loadMap(std::string const& filepath) { std::ifstream infile(filepath.c_str()); if(infile.fail()) { std::cerr << "Error opening file: " << filepath << std::endl; return; } std::string line; // 逐行读取文件 while (std::getline(infile, line)) { // 跳过空行和注释行 if (line.empty() || line[0] == '#') { continue; } std::istringstream line_stream(line); std::string char_name; double x = 0.0, y = 0.0; // 流自动跳过所有空白字符,依次读取角色名、x、y三个字段 line_stream >> char_name >> x >> y; // 校验读取是否成功,匹配目标角色 if (line_stream && char_name == "CharacterName1") { // 此处x、y已经是转换完成的double类型,写入你的业务逻辑即可 std::cout << "匹配到CharacterName1,坐标x:" << x << ",y:" << y << std::endl; // 如果只需要查找这一个角色,读完可以直接break跳出循环 // break; } // 如需匹配其他角色,追加判断即可 else if (line_stream && char_name == "CharacterName2") { std::cout << "匹配到CharacterName2,坐标x:" << x << ",y:" << y << std::endl; } } infile.close(); }
实现说明
std::istringstream的>>运算符默认会自动跳过任意数量的空格、制表符等空白字符,不需要手动处理空格分割逻辑,同时会自动完成字符串到double类型的转换,读取后校验流的状态还可以自动识别格式错误的行,避免未定义行为。
内容的提问来源于stack exchange,提问作者user15983119
相关产品推荐
相关产品推荐

