C++读取键值对文件时,如何跳过以#开头的行?
解决方案
要跳过所有以#开头的整行,你得先按整行读取文件内容,判断行首是否为#后,再决定是否处理该行的键值对——直接用getline(inFile, astring, '=')会忽略行边界,根本没法判断整行是不是注释行。
具体实现思路:
- 先读取完整的一行到临时字符串
- 检查该行是否为空,或者以
#开头:满足任一条件就直接跳过当前循环 - 若不是注释行,再对这一行做按
=分割的操作,把键和值存入vector
示例代码:
#include <fstream> #include <string> #include <vector> #include <utility> using namespace std; int main() { ifstream inFile("target_file.txt"); vector<pair<string, string>> keyValueList; string line; while (getline(inFile, line)) { // 先按整行读取 // 跳过空行和注释行 if (line.empty() || line[0] == '#') { continue; } // 分割键和值 size_t equalMarkPos = line.find('='); if (equalMarkPos != string::npos) { string key = line.substr(0, equalMarkPos); string value = line.substr(equalMarkPos + 1); keyValueList.emplace_back(key, value); } } inFile.close(); // 后续处理vector逻辑... return 0; }
如果一定要保留你原本用getline按=分割的逻辑,也可以把整行内容放进字符串流,再从流里拆分:
#include <sstream> // ...(其余代码同上) while (getline(inFile, line)) { if (line.empty() || line[0] == '#') { continue; } stringstream lineStream(line); string key, value; if (getline(lineStream, key, '=') && getline(lineStream, value)) { keyValueList.emplace_back(key, value); } }
两种写法都能确保跳过所有#开头的整行,同时正确提取有效键值对。
内容的提问来源于stack exchange,提问作者Agustín Saenz
相关产品推荐
相关产品推荐

