Перемещение по файлу с++
У меня есть файл, в файле данные пользователей (имена, номера телефонов и тд.), мне нужно считывать эти данные и записывать в вектор при помощи цикла, то есть первого пользователя я считываю с начала, второго уже нужно с 6 строки, третьего с 12, четвертого с 18 и тд., то есть каждый раз начало строки должно увеличиваться на 6, я знаю что есть метод seekg() , но он перемещает указатель по горизонтали, указанной строки, а как мне перемещаться по вертикали, я пробовал писать f.seekg(6, std::ios::beg), вроде как оно перемещается, но данные записываются не по порядку, а рандомно, дайте совет как лучше
#include <fstream>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
struct Person {
string name;
string address;
string phone;
string education;
string interests;
string note;
friend ostream& operator<<(ostream& out, const Person& person) {
const char* fmt = "\n\t* ";
out << " * "
<< person.name << fmt
<< person.address << fmt
<< person.phone << fmt
<< person.education << fmt
<< person.interests << fmt
<< person.note;
return out;
}
};
vector<Person> load(const string& path) {
fstream file(path);
vector<Person> persons;
if (file.is_open()) {
string line;
auto position = 0;
Person person;
while (getline(file, line)) {
switch (++position % 6) {
case 0:
person.note = line;
persons.push_back(person);
break;
case 1:
person.name = line;
break;
case 2:
person.address = line;
break;
case 3:
person.phone = line;
break;
case 4:
person.education = line;
break;
case 5:
person.interests = line;
break;
}
}
}
return persons;
}
void show(const vector<Person>& persons) {
for (const auto& person : persons) cout << person << "\n\n";
}
int main() {
system("chcp 1251 > nul");
auto db = load("persons.txt");
show(db);
system("pause > nul");
}
Функция seekg тут не нужна и наверно даже неприменима, поскольку у строк может быть разная длина.
Просто читай файл построчно.
Плохо у тебя с арифметикой!
Если начинаешь с ПЕРВОЙ строки, а потом переходишь на 6-ю, то шаг 5.
А от 6 до 12 - шаг ШЕСТЬ!
читай сплошным потоком, так - проще. Если нужно записывать в произвольном порядке - придется разделить файл на блоки фиксированной длины и записывать их, тогда перемещение будет на номер блока, умноженный на размер блока.
По текстовому файлу по строкам перемещаться не получится так просто. Только, если ты где-то запомнишь смещения для каждой строки относительно начала файла.
Так что - по текстовому файлу только последовательное чтение и подсчет маркеров конца строки.