需求:
c++ 读取一个文件, 逐行读取, 每行使用 冒号分割,然后使用空格分割 找到一行中的每一个元素, 不包含前后两头的空格作为返回元素
实现:
在C++中,可以使用标准库提供的文件I/O和字符串处理功能来实现逐行读取文件、使用冒号和空格分割每行并去除前后空格的功能。以下是一个示例程序,它演示了如何实现这一功能:
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <algorithm>
// 去除字符串前后的空格
std::string trim(const std::string &str) {
size_t first = str.find_first_not_of(' ');
if (first == std::string::npos)
return "";
size_t last = str.find_last_not_of(' ');
return str.substr(first, last - first + 1);
}
// 分割字符串
std::vector<std::string> split(const std::string &str, char delimiter) {
std::vector<std::string> tokens;
std::string token;
std::istringstream tokenStream(str);
while (std::getline(tokenStream, token, delimiter)) {
tokens.push_back(trim(token));
}
return tokens;
}
int main() {
std::ifstream file("example.txt");
std::string line;
if (!file.is_open()) {
std::cerr << "Unable to open file" << std::endl;
return 1;
}
while (std::getline(file, line)) {
// 使用冒号分割每行
std::vector<std::string> colonSplit = split(line, ':');
for (const auto &part : colonSplit) {
// 使用空格分割每个部分
std::vector<std::string> spaceSplit = split(part, ' ');
for (const auto &element : spaceSplit) {
if (!element.empty()) {
std::cout << element << std::endl; // 打印每个元素
}
}
}
}
file.close();
return 0;
}
代码解释
trim
函数:- 该函数去除字符串前后的空格。
find_first_not_of
和find_last_not_of
用于找到第一个和最后一个非空格字符的位置,然后使用substr
函数提取去除前后空格的子字符串。
- 该函数去除字符串前后的空格。
split
函数:- 该函数按照指定的分隔符分割字符串,并去除每个子字符串前后的空格。使用
std::getline
从istringstream
中逐个提取被分隔的子字符串,并将去除空格后的结果存储在一个std::vector<std::string>
中返回。
- 该函数按照指定的分隔符分割字符串,并去除每个子字符串前后的空格。使用
main
函数:- 打开文件并逐行读取。
- 每行首先按照冒号分割,得到的每个部分再按照空格分割。
- 去除每个部分的前后空格后,输出每个非空的元素。
文件读取与处理
该程序会逐行读取名为example.txt
的文件,并按行处理。每行会首先按冒号分割,然后再按空格分割,并输出每个非空的元素。
示例输入文件 (example.txt
)
key1: value1 value2 value3
key2: value4 value5 value6
示例输出
key1
value1
value2
value3
key2
value4
value5
value6
这段代码确保在分割每行字符串时去除了前后空格,并正确处理了冒号和空格分割的情况。