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");
}
#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");
}
читай сплошным потоком, так - проще. Если нужно записывать в произвольном порядке - придется разделить файл на блоки фиксированной длины и записывать их, тогда перемещение будет на номер блока, умноженный на размер блока.
Сергей Раушанов
ничего не понял, можно проще пояснить, я чайник
Плохо у тебя с арифметикой!
Если начинаешь с ПЕРВОЙ строки, а потом переходишь на 6-ю, то шаг 5.
А от 6 до 12 - шаг ШЕСТЬ!
Если начинаешь с ПЕРВОЙ строки, а потом переходишь на 6-ю, то шаг 5.
А от 6 до 12 - шаг ШЕСТЬ!
Сергей Раушанов
это мелочи жизни, нужно сначала понять как реализовать, а подбирать шаг это уже на этапе тестов, суть в самой реализации а не в промежутке между данными, главное что он одинакового размера, подобрать его уже не проблема, если есть понимание как что работает
По текстовому файлу по строкам перемещаться не получится так просто. Только, если ты где-то запомнишь смещения для каждой строки относительно начала файла.
Так что - по текстовому файлу только последовательное чтение и подсчет маркеров конца строки.
Так что - по текстовому файлу только последовательное чтение и подсчет маркеров конца строки.
Функция seekg тут не нужна и наверно даже неприменима, поскольку у строк может быть разная длина.
Просто читай файл построчно.
Просто читай файл построчно.
Сергей Раушанов
это понятно, построчно он и читается, но, нужно считать первые 5 строк, инициализировать ими объект класса, запушить в вектор, затем следующие 5 строк, так само до тех пор пока не дойдет до конца файла, я не могу одним открытием файла считать сразу все данные
Александр Дьячков
В принципе, Дед Мазай выше вам все ответил. А я хочу немного дополнить, уведя обсуждение чуть вбок. Дело в том, что файловый интерфейс С++ может быть кому-то и кажется удобным, потому что описан в книжках, но его нельзя назвать совершенством. Я бы даже сказал, что он весьма убог и бесполезен. Если вы пишите что-то, что будет реально работать, то возможно лучше организовать файловый ввод-вывод как-то по иному. Во-вторых, если вам важно быстродействие, имеет смысл подумать над тем, чтобы сразу считывать в память большой кусок данных, а потом разбирать его на куски самостоятельно. Это усложнит код, но существенно повысит быстродействие. Также, не зная подробностей, трудно судить о применимости, однако, на мой взгляд, хранение полученных данных в векторе не самая удачная идея.
Похожие вопросы
- C++ Работа с файлами.
- Помогите решить задачку по теме работа с файлами C++
- Нужно найти в бинарном файле введенные пользователем данные.
- Как в C++ продолжить классы разные сгруппировано в файлах .h и .cpp, при этом не переопределяя классы эти?
- Работа с текстовым файлом. С++
- Модули. Коммуникация между двумя .c файлами.(Си)
- Input.txt и output.txt. Работа с текстовыми файлами C++.
- Си заголовочный файл, немного бы пролить свет
- Помогите написать код с файлами C++
- Помогите написать код с файлами C++