C++如何每3行向pair构成的vector中添加元素,getline可否读后续行
getline的访问特性
std::getline本身没有提供类似数组下标偏移的直接访问能力,它是流式读取接口,每次调用只会从输入流的当前位置读取一行内容,读取完成后流的读取指针自动后移到下一行开头,无法跳过中间行直接读取指定位置的行。
实现方案
你现在已经在使用的先把全量文本行读入vector再随机访问是最通用、易维护的方案,对于绝大多数场景都适用,你要生成两组pair的vector可以直接基于已经读好的vector_of_text实现:
#include <vector> #include <string> #include <fstream> #include <utility> // pair头文件 using namespace std; int main() { vector<string> vector_of_text; string line_of_text; ifstream test_file("test.txt"); if(test_file.is_open()){ while(getline(test_file, line_of_text)){ vector_of_text.push_back(line_of_text); // 注意你原代码这里漏了分号 } test_file.close(); } // 生成你需要的两组pair vector vector<pair<string, string>> pair1_vec, pair2_vec; // 确认行数足够再访问,避免越界 if (vector_of_text.size() >= 3) { pair1_vec.emplace_back(vector_of_text[0], vector_of_text[1]); // line1+line2 pair2_vec.emplace_back(vector_of_text[0], vector_of_text[2]); // line1+line3 } return 0; }
如果你遇到文件极大、不想把所有内容都加载进内存的特殊场景,也可以手动暂存需要复用的行,边读边生成pair:
vector<pair<string, string>> pair1_vec, pair2_vec; string line1, line; ifstream test_file("test.txt"); if (test_file.is_open()) { // 先读第一行存好 if (getline(test_file, line1)) { // 读第二行,和line1组成第一组pair if (getline(test_file, line)) { pair1_vec.emplace_back(line1, line); } // 读第三行,和line1组成第二组pair if (getline(test_file, line)) { pair2_vec.emplace_back(line1, line); } } test_file.close(); }
内容的提问来源于stack exchange,提问作者rrekaF
相关产品推荐
相关产品推荐

