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

от admin

Writing a vector to a file

The following function (function template rather) is to take a vector of any type and write it a file using a filestream object.

This function is very straightforward and simple; however, I’m a student to C++ and would love to learn different ways of doing even the simplest of tasks.

1 Answer 1

You need to include the headers your code depends on; don’t assume that the user of your code will include them for you:

Never require your user to bring names into the current namespace; type names used in your public interface should always be qualified:

Don’t attempt to write to an istream . Your output should go to an ostream instead. You could use an ofstream , but that’s quite specific. Instead, you should accept a reference to any ostream ; the user can then pass an ofstream or std::cout or any other output stream:

There’s nothing in your code that wouldn’t work for a std::list equally as well as for a std::vector , so you can be more general:

Naming: del evokes "delete" in my head before I reset and think "delimiter". It might be better written in full, or perhaps as sep for "separator".

Layout: at first glance, it’s not obvious which code is controlled by the for condition, as you have inconsistent indentation.

Writing a backspace over the final delimiter isn’t the same as not writing the delimiter. If you want the delimiter between items but not after the final item, the usual way is to track whether the loop is in its first iteration:

Error reporting: instead of just assuming that the writes are all successful, we could report via the return value from the function. This may help the user remember to deal with errors, which could be overlooked if they have to check the stream state after the call.

Запись вектора в бинарный файл, циклом — 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 и т.д.

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

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

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

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

  • Facebook
  • Вконтакте
  • Twitter

  • Facebook
  • Вконтакте
  • Twitter

Спасибо!
Вопрос еще возник, добавила второй файл из которого добавляю значение в каждую строку
input2.txt:
0 0 0 0 1 1
0 0 0 0 1 1
0 0 0 0 1 1
0 0 0 0 1 1
0 0 0 0 1 1

Почему только в первой строке пишет верное значение 30 00, потом уже не то

В файле input2.txt хранятся наборы битов, каждый бит может иметь одно из двух значений – 0 или 1.
Значения каждой строки должны хранится в двух байтах.
Строку 0 0 0 0 1 1 можно записать в два байта как 30 00 используя побитовые операторы, а именно присваивание с побитовой операцией ИЛИ |=.

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

01 00 00 00 01 00 02 00 03 00 04 00 05 00 06 00 30 00 02 00 00 00 07 00 08 00 09 00 0А 00 0В 00 0С 00 00 0С 03 00 00 00 0D 00 0E 00 0F 00 10 00 11 00 12 00 00 00

Rsa97

Значит правильно выбирайте размер данных. int, в общем случае, может иметь размер 16, 32 или 64 бита, в зависимости от системы и компилятора, short — от 8 до 64 бит.
Используйте int32_t для 4-байтовых и int16_t для 2-байтовых чисел (__int32 и __int16 в старых версиях Visual C++).

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

В этом все дело. Как писать и читать двоичные файлы с std :: vector внутри них?

Я думал что-то вроде:

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

Итак, как выполнить операцию?

Решение

Попробуйте использовать ostream_iterator / ostreambuf_iterator , istream_iterator / istreambuf_iterator и STL copy методы:

Другие решения

Если вы не хотите использовать boost — напишите размер и vector ,

Ты можешь использовать

Перед чтением vector , вы должны изменить его размер: yourVector.size(numberOfElementsYouRead) ,

Кроме того, sizeof(vector ) это просто размер vector внутренняя реализация объекта; размер элемента вектора sizeof(std::vector ::value_type) ,

Затем прочитайте это так:

Я использовал тот факт, что метод data () возвращает адрес, который вы можете использовать для чтения AND для записи.

// Предположим, что outf — это доступный для записи указатель файла (двоичный).
// записываем myVector.size () в файл, затем

// читаем MyVector.size () из файла как nv, inpf читает указатель файла

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

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

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

Есть файл input.txt с таким содержимым:
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28 29 30

Записала содержимое в вектор и хочу записать в бинарный файл 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 и т.д.

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

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

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

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

Спасибо!
Вопрос еще возник, добавила второй файл из которого добавляю значение в каждую строку
input2.txt:
0 0 0 0 1 1
0 0 0 0 1 1
0 0 0 0 1 1
0 0 0 0 1 1
0 0 0 0 1 1

Почему только в первой строке пишет верное значение 30 00, потом уже не то

В файле input2.txt хранятся наборы битов, каждый бит может иметь одно из двух значений – 0 или 1.
Значения каждой строки должны хранится в двух байтах.
Строку 0 0 0 0 1 1 можно записать в два байта как 30 00 используя побитовые операторы, а именно присваивание с побитовой операцией ИЛИ |=.

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

01 00 00 00 01 00 02 00 03 00 04 00 05 00 06 00 30 00 02 00 00 00 07 00 08 00 09 00 0А 00 0В 00 0С 00 00 0С 03 00 00 00 0D 00 0E 00 0F 00 10 00 11 00 12 00 00 00

Читать:
Во сколько надо выходить

индекс (4 байта) + 6 значений из вектора по 2 байта

Значит правильно выбирайте размер данных. int, в общем случае, может иметь размер 16, 32 или 64 бита, в зависимости от системы и компилятора, short — от 8 до 64 бит.
Используйте int32_t для 4-байтовых и int16_t для 2-байтовых чисел (__int32 и __int16 в старых версиях Visual C++).

Cтруктура вектора содержит не значения, записанные в вектор, а указатели на начало и конец блока памяти, выделенного для хранения этих значений (https://stackoverflow.com/questions/27466373/memor. Реализация этой структуры зависит от компилятора. Поэтому в строке

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

Чтение и запись вектора C++ в файл

для некоторых графических работ мне нужно как можно быстрее прочитать большой объем данных и в идеале хотелось бы напрямую читать и записывать структуры данных на диск. В основном у меня есть загрузка 3d-моделей в различных форматах файлов, которые слишком долго загружаются, поэтому я хочу записать их в «подготовленный» формат в виде кэша, который будет загружаться намного быстрее при последующих запусках программы.

безопасно ли это делать так? Мои тревоги вокруг непосредственно чтения в данные вектор? Я удалил проверку ошибок, жестко закодировал 4 как размер int и так далее, чтобы я мог дать короткий рабочий пример, я знаю, что это плохой код, мой вопрос действительно в том, безопасно ли в C++ читать целый массив структур непосредственно в вектор, как это? Я считаю, что это так, но у c++ так много ловушек и неопределенного поведения, когда вы начинаете идти на низкий уровень и иметь дело непосредственно с необработанной памятью.

Я понимаю, что числовые форматы и размеры могут меняться по платформы и компиляторы, но это будет даже прочитано и написано той же программой компилятора для кэширования данных, которые могут потребоваться при более позднем запуске той же программы.

6 ответов

как говорит Лауринас, std::vector гарантированно будет смежным, так что это должно работать, но это потенциально непереносимо.

на большинстве систем, sizeof(Vertex) будет 12, но это не редкость для структуры, чтобы быть проложенным, так что sizeof(Vertex) == 16 . Если вы пишете данные в одной системе, а затем прочитать этот файл в другой, нет никакой гарантии, что она будет работать правильно.

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

вот пример кода, который делает то, что ты ищешь:

обратите внимание, что мне пришлось реализовать

std::vector гарантированно будет непрерывным в памяти, так что, да.

Чтение и запись std :: vector в файл правильно

В этом все дело. Как писать и читать двоичные файлы с std :: vector внутри них?

Я думал что-то вроде:

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

Итак, как выполнить операцию?

Решение

Попробуйте использовать ostream_iterator / ostreambuf_iterator , istream_iterator / istreambuf_iterator и STL copy методы:

Другие решения

Если вы не хотите использовать boost — напишите размер и vector ,

Ты можешь использовать

Перед чтением vector , вы должны изменить его размер: yourVector.size(numberOfElementsYouRead) ,

Кроме того, sizeof(vector ) это просто размер vector внутренняя реализация объекта; размер элемента вектора sizeof(std::vector ::value_type) ,

Затем прочитайте это так:

Я использовал тот факт, что метод data () возвращает адрес, который вы можете использовать для чтения AND для записи.

// Предположим, что outf — это доступный для записи указатель файла (двоичный).
// записываем myVector.size () в файл, затем

// читаем MyVector.size () из файла как nv, inpf читает указатель файла

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

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

Чтение и запись вектора C++ в файл

для некоторых графических работ мне нужно как можно быстрее прочитать большой объем данных и в идеале хотелось бы напрямую читать и записывать структуры данных на диск. В основном у меня есть загрузка 3d-моделей в различных форматах файлов, которые слишком долго загружаются, поэтому я хочу записать их в «подготовленный» формат в виде кэша, который будет загружаться намного быстрее при последующих запусках программы.

безопасно ли это делать так? Мои тревоги вокруг непосредственно чтения в данные вектор? Я удалил проверку ошибок, жестко закодировал 4 как размер int и так далее, чтобы я мог дать короткий рабочий пример, я знаю, что это плохой код, мой вопрос действительно в том, безопасно ли в C++ читать целый массив структур непосредственно в вектор, как это? Я считаю, что это так, но у c++ так много ловушек и неопределенного поведения, когда вы начинаете идти на низкий уровень и иметь дело непосредственно с необработанной памятью.

Я понимаю, что числовые форматы и размеры могут меняться по платформы и компиляторы, но это будет даже прочитано и написано той же программой компилятора для кэширования данных, которые могут потребоваться при более позднем запуске той же программы.

6 ответов

как говорит Лауринас, std::vector гарантированно будет смежным, так что это должно работать, но это потенциально непереносимо.

на большинстве систем, sizeof(Vertex) будет 12, но это не редкость для структуры, чтобы быть проложенным, так что sizeof(Vertex) == 16 . Если вы пишете данные в одной системе, а затем прочитать этот файл в другой, нет никакой гарантии, что она будет работать правильно.

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

Write Vector to File in C++

This article discusses different methods to Write Vector to File in C++.

Vectors in C++ are sequential containers similar to arrays. However, vectors need to have a fixed size.

On the other hand, files facilitate the storage of data permanently to the disk, therefore, mitigating the data loss even after the program stops execution.

Write Vector to File in C++ using vector indices

You can traverse all the elements of a vector one by one using the indices. Writing to the file is similar to writing to the console output except that you need to open a file output stream.

You can open the file using the fstream library’s open() function. The definition of the open() function is given below.

Похожие статьи