C/C++

Перемещение по файлу с++

У меня есть файл, в файле данные пользователей (имена, номера телефонов и тд.), мне нужно считывать эти данные и записывать в вектор при помощи цикла, то есть первого пользователя я считываю с начала, второго уже нужно с 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");
}
НЖ
Нурлан Жанай Кожабаев
83 850
Лучший ответ
читай сплошным потоком, так - проще. Если нужно записывать в произвольном порядке - придется разделить файл на блоки фиксированной длины и записывать их, тогда перемещение будет на номер блока, умноженный на размер блока.
Виктор Шконда
Виктор Шконда
68 872
Сергей Раушанов ничего не понял, можно проще пояснить, я чайник
Плохо у тебя с арифметикой!
Если начинаешь с ПЕРВОЙ строки, а потом переходишь на 6-ю, то шаг 5.
А от 6 до 12 - шаг ШЕСТЬ!
Боксер :)
Боксер :)
86 683
Сергей Раушанов это мелочи жизни, нужно сначала понять как реализовать, а подбирать шаг это уже на этапе тестов, суть в самой реализации а не в промежутке между данными, главное что он одинакового размера, подобрать его уже не проблема, если есть понимание как что работает
По текстовому файлу по строкам перемещаться не получится так просто. Только, если ты где-то запомнишь смещения для каждой строки относительно начала файла.
Так что - по текстовому файлу только последовательное чтение и подсчет маркеров конца строки.
Функция seekg тут не нужна и наверно даже неприменима, поскольку у строк может быть разная длина.
Просто читай файл построчно.
Вадим Панарин
Вадим Панарин
58 065
Сергей Раушанов это понятно, построчно он и читается, но, нужно считать первые 5 строк, инициализировать ими объект класса, запушить в вектор, затем следующие 5 строк, так само до тех пор пока не дойдет до конца файла, я не могу одним открытием файла считать сразу все данные
Александр Дьячков В принципе, Дед Мазай выше вам все ответил. А я хочу немного дополнить, уведя обсуждение чуть вбок. Дело в том, что файловый интерфейс С++ может быть кому-то и кажется удобным, потому что описан в книжках, но его нельзя назвать совершенством. Я бы даже сказал, что он весьма убог и бесполезен. Если вы пишите что-то, что будет реально работать, то возможно лучше организовать файловый ввод-вывод как-то по иному. Во-вторых, если вам важно быстродействие, имеет смысл подумать над тем, чтобы сразу считывать в память большой кусок данных, а потом разбирать его на куски самостоятельно. Это усложнит код, но существенно повысит быстродействие. Также, не зная подробностей, трудно судить о применимости, однако, на мой взгляд, хранение полученных данных в векторе не самая удачная идея.