Как записать вектор в файл c
Перейти к содержимому

Как записать вектор в файл c

  • автор:

Как максимально быстро записать вектор в файл

Собственно есть вектор std::vector outputdata
Есть файл в папке с программой output.txt
Как максимально быстро можно записать вектор в файл так, чтобы 1й байт файла соответствовал первому элементу outdata[0] , последний — последнему outdata[56871] .

Отслеживать

222k 15 15 золотых знаков 120 120 серебряных знаков 234 234 бронзовых знака

задан 2 окт 2020 в 21:42

Alrott SlimRG Alrott SlimRG

1,567 10 10 серебряных знаков 40 40 бронзовых знаков

Как записать вектор в файл c

Всем привет!
Собсна интересует сабж. Поиск мало что дал по форуму, т.к. законченного пояснения с примером я не нашёл. А из того что есть, достаточно тривиально.
Но, вы же понимаете, как правило, в основном происходит так:
— считали из файла
— что-то поделали с этими данными (добавили, удалили, модифицировали)
— записали обратно

Хотелось бы:
— я уже считал файл в вектор
— теперь хочу при пробегании по элементам контейнера что-то поделать с элементом (модифицировать, проверить, пропустить и т.д.) и записать его в файл (может и пропустить, незаписывать).

typedef std::vector _STRING_LIST;
.
_STRING_LIST v; // здесь уже что-то есть, он готов для вывода

std::ofstream output_buffer(lpszFileName, std::ios::out);

CFileWriter fileWriter(&output_buffer);
std::for_each(input_file_lines.begin(), input_file_lines.end(), fileWriter);

Но мне так не нравится, научите пользоваться std::transform или как прибиндить функцию.
Т.е. чтобы при записи каждого элемента контейнера проделывались какие та действия с элементом, и потом уже решалось, записывать его туда или нет.

Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!

Re: Запись вектора в файл

От: _Dreamer
Дата: 29.12.06 08:02
Оценка:

Здравствуйте, Smooky, Вы писали:

S>Хотелось бы:
S>- я уже считал файл в вектор
S>- теперь хочу при пробегании по элементам контейнера что-то поделать с элементом (модифицировать, проверить, пропустить и т.д.) и записать его в файл (может и пропустить, незаписывать).

S>Но мне так не нравится, научите пользоваться std::transform или как прибиндить функцию.
S>Т.е. чтобы при записи каждого элемента контейнера проделывались какие та действия с элементом, и потом уже решалось, записывать его туда или нет.

#include #include #include bool predicate( const std::string& str ) // здесь решаем, надо ли записывать в файл < return str == "hello"; > void func() < std::vectorvstrings; // заполняем вектор std::ofstream ofile( "output.txt" ); std::remove_copy_if( vstrings.begin(), vstrings.end(), std::ostream_iterator< std::string >( ofile ), predicate ); >

Re[2]: Запись вектора в файл

От: Smooky
Дата: 29.12.06 08:36
Оценка:
_D>#include _D>#include _D>#include _D>bool predicate( const std::string& str ) // здесь решаем, надо ли записывать в файл _D> < _D>return str == "hello"; _D>> _D>void func() _D> < _D>std::vector vstrings; _D> // заполняем вектор _D> std::ofstream ofile( "output.txt" ); _D> std::remove_copy_if( _D> vstrings.begin(), _D> vstrings.end(), _D> std::ostream_iterator< std::string >( ofile ), _D> predicate ); _D>> _D>

Ага, спасибо, работает. буду щас разбирацца, как это работает.
Осваиваю STL, понимаю, штука мощьная, сила. но надо научицца пользовацца. к сожалению источников и полезных доков очень мало.

Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!

Re[3]: Запись вектора в файл

От: vkjr hookahmixes.com/ru
Дата: 29.12.06 09:27
Оценка:

Читай Джосаттиса «С++ Стандартная библиотека», там очень много полезной информации.

> Ага, спасибо, работает. буду щас разбирацца, как это работает.
> Осваиваю STL, понимаю, штука мощьная, сила. но надо научицца пользовацца. к сожалению источников и полезных доков очень мало.

Posted via RSDN NNTP Server 2.0
Re[4]: Запись вектора в файл

От: Smooky
Дата: 29.12.06 09:43
Оценка:

Здравствуйте, vkjr, Вы писали:

V>Читай Джосаттиса «С++ Стандартная библиотека», там очень много полезной информации.

>> Ага, спасибо, работает. буду щас разбирацца, как это работает.
>> Осваиваю STL, понимаю, штука мощьная, сила. но надо научицца пользовацца. к сожалению источников и полезных доков очень мало.

Да, читаю. вот сделал как у Мейэрса. но почему та не работает

// Читаем в вектор из текстового файла только те строки, длина которых больше 32 // v = пустой bool IsCorrectStringLength(const std::string& str) < return (str.length() > 32); > templatetypename _X, typename _Y, typename _Pred> _Y copy_if(_X begin, _X end, _Y dest, _Pred p) < while (begin != end) < if (p(*begin)) *dest++=*begin; ++begin; > return dest; > . typedef std::vector _STRING_LIST; _STRING_LIST v; std::ifstream input_buffer(lpszFileName, std::ios::in); std::istream_iterator fileBegin(input_buffer); std::istream_iterator fileEnd; copy_if(fileBegin, fileEnd, v(), IsCorrectStringLength);

Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!

Re[5]: Запись вектора в файл

От: Stepkh
Дата: 29.12.06 10:52
Оценка:

Здравствуйте, Smooky, Вы писали:

S>Здравствуйте, vkjr, Вы писали:

V>>Читай Джосаттиса «С++ Стандартная библиотека», там очень много полезной информации.

>>> Ага, спасибо, работает. буду щас разбирацца, как это работает.
>>> Осваиваю STL, понимаю, штука мощьная, сила. но надо научицца пользовацца. к сожалению источников и полезных доков очень мало.

S>Да, читаю. вот сделал как у Мейэрса. но почему та не работает

S>.

S>typedef std::vector _STRING_LIST;
S>_STRING_LIST v;

S>std::ifstream input_buffer(lpszFileName, std::ios::in);
S>std::istream_iterator fileBegin(input_buffer);
S>std::istream_iterator fileEnd;

S>copy_if(fileBegin, fileEnd, v(), IsCorrectStringLength);

copy_if(fileBegin, fileEnd, back_inserter(v), IsCorrectStringLength);

Запись вектора в бинарный файл, циклом — C++?

Записала содержимое в вектор и хочу записать в бинарный файл data.dat только поэлементно с индексом строки. Файл должен иметь структуру: индекс (4 байта) + 6 значений из вектора по 2 байта.

01 00 00 00 01 00 02 00 03 00 04 00 05 00 06 00 02 00 00 00 07 00 08 00 и т.д.

Вот мой код, но пишет неправильно

#include "stdafx.h" #include #include #include #include #include using namespace std; int main() < std::fstream input("input.txt"); std::vectorvec; // значения из файла std::copy(std::istream_iterator(input), std::istream_iterator(), std::back_inserter(vec)); std::copy(vec.begin(), vec.end(), std::ostream_iterator(std::cout, " ")); ofstream fout("data.dat", std::ios::out | ios::binary); int countstring = 5; int index = 0; int row = 6; for (int i = 0; i > fout.close(); return 0;

Подскажите, как исправить второй цикл, чтоб записывать поэлементно

  • Вопрос задан более трёх лет назад
  • 1359 просмотров

1 комментарий

Простой 1 комментарий

Векторы в C++: для начинающих

обложка статьи

Всем привет! До этого дня мы использовали чистые массивы. Чистые — это значит простые массивы, не имеющие у себя в багаже различных функций. В этом уроке мы пройдем нечистые массивы — векторы.

Что такое вектор (vector)

Вектор — это структура данных, которая уже является моделью динамического массива.

Давайте вспомним о том, что для создания динамического массива (вручную) нам нужно пользоваться конструктором new и вдобавок указателями. Но в случае с векторами всего этого делать не нужно. Вообще, по стандарту пользоваться динамическим массивом через конструктор new — не есть правильно. Так как в компьютере могут происходить различные утечки памяти.

Как создать вектор (vector) в C++

Сначала для создания вектора нам понадобится подключить библиотеку — , в ней хранится шаблон вектора.

#include 

Кстати, сейчас и в будущем мы будем использовать именно шаблон вектора. Например, очередь или стек, не созданные с помощью массива или вектора, тоже являются шаблонными.

Далее, чтобы объявить вектор, нужно пользоваться конструкцией ниже:

vector  тип данных > имя вектора>;
  • Вначале пишем слово vector .
  • Далее в угольных скобках указываем тип, которым будем заполнять ячейки.
  • И в самом конце указываем имя вектора.
vector string> ivector;

В примере выше мы создали вектор строк.

Кстати, заполнить вектор можно еще при инициализации (другие способы мы пройдем позже — в методах вектора). Делается это также просто, как и в массивах. Вот так:

vectorint> ivector = элемент[0]>, элемент[1]>, элемент[2]>>;

После имени вектора ставим знак равенства и скобки, в которых через пробел указываем значение элементов.

Такой способ инициализации можно использовать только начиная с C++11!

Так, чтобы заполнить вектор строками, нам нужно использовать кавычки — «строка» .

Второй способ обратиться к ячейке

Мы знаем, что в векторе для обращения к ячейке используются индексы. Обычно мы их используем совместно с квадратными скобками [] .

Но в C++ есть еще один способ это сделать благодаря функции — at(). В скобках мы должны указать индекс той ячейки, к которой нужно обратиться.

Вот как она работает на практике:

vector int> ivector = 1, 2, 3>; ivector.at(1) = 5; // изменили значение второго элемента cout  .at(1); // вывели его на экран

Давайте запустим эту программу:

5 Process returned 0 (0x0) execution time : 0.010 s Press any key to continue.

Как указать количество ячеек для вектора

Указывать размер вектора можно по-разному. Можно это сделать еще при его инициализации, а можно хоть в самом конце программы. Вот, например, способ указать длину вектора на старте:

vector int> vector_first(5);

Так в круглых скобках () после имени вектора указываем первоначальную длину. А вот второй способ:

vector int> vector_second; // создали вектор vector_second.reserve(5); // указали число ячеек

Первая строчка нам уже знакома. А вот во второй присутствует незнакомое слово — reserve , это функция, с помощью которой мы говорим компилятору, какое количество ячеек нам нужно использовать.

Вы можете задать логичный вопрос: “А в чем разница?“. Давайте создадим два вектора и по-разному укажем их количество ячеек.

#include #include // подключили библиотеку using namespace std; int main()  setlocale(0, ""); vector int> vector_first(3); // объявили // два vector int> vector_second; // вектора vector_second.reserve(3); cout  <"Значения первого вектора (с помощью скобок): "; for (int i = 0; i  3; i++)  cout  [i]  <" "; > cout  <"Значения второго вектора (с помощью reserve): "  ; for (int i = 0; i  3; i++)  cout  [i]  <" "; > system("pause"); return 0; >
Значения первого вектора (с помощью скобок): 0 0 0 Значения второго вектора (с помощью reserve): 17 0 0 Process returned 0 (0x0) execution time : 0.010 s Press any key to continue.

Как видим, в первом случае мы вывели три нуля, а во втором: 17, 0, 0.

Все потому, что при использовании первого способа все ячейки автоматически заполнились нулями.

При объявлении чего-либо (массива, вектора, переменной и т.д) мы выделяем определенное количество ячеек памяти, в которых уже хранится ненужный для ПК мусор. В нашем случае этим мусором являются числа.

Поэтому, когда мы вывели второй вектор, в нем уже находились какие-то рандомные числа — 17, 0, 0. Обычно они намного больше. Можете кстати попробовать создать переменную и вывести ее значение.

Нужно помнить! При использовании второго способа есть некоторый плюс — по времени. Так как для первого способа компилятор тратит время, чтобы заполнить все ячейки нулями.

Как сравнить два вектора

Если в середине программы нам понадобится сравнить два массива, мы, конечно, используем цикл for и поочередно проверим все элементы.

Вектор опять на шаг впереди! Чтобы нам сравнить два вектора, потребуется применить всего лишь оператор ветвления if.

if (vec_first == vec_second)  // сравнили! cout  <"Они равны!"; > else  cout  <"Они не равны"; >

Конечно, компилятор все равно прогонит эти два вектора по циклу, проверяя ячейки. Но оцените, насколько благодаря этому программа стала компактнее. Разве это не прекрасно?

Вот так бы выглядела программа выше, если бы мы не использовали знак равенства для векторов.

bool flag = true; if (vec_first.size() == vec_second.size())  for (int i = 0; i  vec_first.size(); i++)  if (vec_first[i] != vec_second[i])  cout  <"Они не равны!"; flag = false; break; // выходим из цикла > > > else  flag = false; cout  <"Они не равны!"; > if (flag)  cout  <"Они равны!"; > 
  1. Сначала мы создали булеву переменную flag равную true . У нее задача такая:
    • Если в условии (строки 5 — 10) она станет равна false — то значит эти векторы не равны и условие (строки 14 — 16) не будет выполняться.
    • Если же она после цикла (строки 3 — 12) останется равна true — то в условии (строки 14 — 16) мы сообщим пользователю, что они равны.
  2. В условии (строка 3) проверяем размеры двух векторов на равенство.
  3. И если условие (строки 5 — 10) будет равно true — то мы сообщим пользователю, что эти два вектора не равны.

Как создать вектор векторов

Понятно, что вам может понадобиться записать числа в двумерный массив. Но зачем использовать массив, если можно оперировать векторами.

Сейчас вы узнаете, как создать вектор векторов или простым языком массив векторов.

vector  vector  тип данных > >;

Как можно увидеть, нам пришлось только добавить слова vector и еще его .

А чтобы указать количество векторов в векторе, нам потребуется метод resize() .

vector  vector int> > vec; vec.resize(10); // десять векторов

Но есть еще одни способ добавления векторов в вектор. Для этого способа мы будем использовать функцию push_back() (читайте ниже, что она делает).

vec.push_back(vector int>());
  • В аргументах функции push_back() находится имя контейнера, который мы хотим добавить. В нашем случае — vector .
  • А дальше идет тип контейнера — .
  • И все заканчивается отрывающей и закрывающей скобкой () .

Для двумерного вектора тоже можно указать значения еще при инициализации:

vector  vector int> > ivector = 1, 4, 7>, 2, 5, 8>, 3, 6, 9>>;

— это значения элементов первого массива (первого слоя). Такие блоки значений, как , должны разделяться запятыми.

Методы для векторов:

Сейчас мы разберем некоторые методы, которые часто используются вместе с векторами. Метод — это функция, которая относится к определенному STL контейнеру.

В нашем случае этим STL контейнером является вектор. Если вы дальше собираетесь оперировать векторами — лучше все перечисленные функции запомнить.

Если нам требуется узнать длину вектора, понадобится функция — size() . Эта функция практически всегда используется вместе с циклом for.

for (int i = 0; i  ivector.size(); i++)  // . >

Также, если нам требуется узнать пуст ли стек, мы можем использовать функцию — empty() .

  • При отсутствии в ячейках какого-либо значения это функция возвратит — true .
  • В противном случае результатом будет — false .

Вот пример с ее использованием:

if (ivector.empty())  // . >

2) push_back() и pop_back()

Как мы сказали выше, у векторов имеются методы, которые помогают оптимизировать и улучшить жизнь прог

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *