Как создать двоичный файл и записать в него n целых чисел?
Создать двоичный файл и записать в него n целых чисел
Создать двоичный файл и записать в него n целых чисел. Из исходного файла сфор- мировать массивы.
Создать двоичный файл и записать в него n целых чисел
Помогите пожалуйста, срочно. Создать двоичный файл и записать в него n целых чисел. Из исходного.
Создать двоичный файл и записать в него n целых чисел
Первая программа должна сформировать двоичный файл. Вторая – считать данные из этого.
Добавлено через 6 минут
плюс гугл в помощь
Создать двоичный файл и записать в него 15 чисел
1.создать двоичный файл и записать в него 15 чисел.из исходного файла сформировать массивы чёт. и.
Создать файл и записать в него n целых чисел
Создать файл и записать в него n целых чисел. Найти среднее арифметическое среди нечетных чисел.
Создать файл целых чисел и записать в него N первых положительных четных чисел
Дано имя файла и целое число N (> 1). Создать файл целых чисел с данным именем и записать в него N.
Создать файл целых чисел и записать в него N первых положительных четных чисел
вот задача: Дано имя файла и целое число N (> 1). Создать файл целых чисел с данным именем и.
The correct way to create Binary files in C#
I opened the file and I’m not seeing something that resembles a picture like this which I always thought a Binary file would look like.
I’m actually able to read the complete text I have written.
So is this it? I’m completely new to this so any help to point me in correct direction will be a lot to me.
![]()
1 Answer 1
The overload of Write that you used: BinaryWriter.Write(String) , writes out the string you provided to the file using encoding.
It looks like you you want to convert those strings to binary data by decoding them as hexadecimal values. except they don’t look like hexadecimal values because they don’t come in groups of 2. Anyway, this procedure is documented here ( How can I convert a hex string to a byte array? ).
Note that the «picture» you posted is of a hex editor. You didn’t describe in your post how you opened the file; if you open a file in Notepad or a similar editor then you’ll always get printed-characters back, not the hexadecimal representation of the file’s contents.
Как создать двоичный файл в c
Для работы с бинарными файлами предназначена пара классов BinaryWriter и BinaryReader . Эти классы позволяют читать и записывать данные в двоичном формате.
BinaryWriter
Для создания объекта BinaryWriter можно применять ряд конструкторов. Возьмем наиболее простую:
в его конструктор передается объект Stream (обычно это объект FileStream).
Основные методы класса BinaryWriter
Close() : закрывает поток и освобождает ресурсы
Flush() : очищает буфер, дописывая из него оставшиеся данные в файл
Seek() : устанавливает позицию в потоке
Write() : записывает данные в поток. В качестве параметра этот метод может принимать значения примитивных данных:
Либо можно передать массивы типов byte и char
При записи массива дополнительно можно указать, с кого элемента массива надо выполнять запись, а также число записываемых элементов массива:
Write(byte[], int, int)
Write(char[], int, int)
Рассмотрим простейшую запись бинарного файла:
Здесь в файл person.dat записываются два значения: строка «Tom» и число 37. Для создание объекта применяется вызов new BinaryWriter(File.Open(path, FileMode.OpenOrCreate))
Подобным образом можно сохранять более сложные данные. Например, сохраним в файл массив объектов:
В данном случае последовательно сохраняем в файл people.dat данные объектов Person из массива people.
BinaryReader
Для создания объекта BinaryReader можно применять ряд конструкторов. Возьмем наиболее простую версию:
в его конструктор также передается объект Stream (также обычно это объект FileStream).
Основные методы класса BinaryReader
Close() : закрывает поток и освобождает ресурсы
ReadBoolean() : считывает значение bool и перемещает указатель на один байт
ReadByte() : считывает один байт и перемещает указатель на один байт
ReadChar() : считывает значение char, то есть один символ, и перемещает указатель на столько байтов, сколько занимает символ в текущей кодировке
ReadDecimal() : считывает значение decimal и перемещает указатель на 16 байт
ReadDouble() : считывает значение double и перемещает указатель на 8 байт
ReadInt16() : считывает значение short и перемещает указатель на 2 байта
ReadInt32() : считывает значение int и перемещает указатель на 4 байта
ReadInt64() : считывает значение long и перемещает указатель на 8 байт
ReadSingle() : считывает значение float и перемещает указатель на 4 байта
ReadString() : считывает значение string. Каждая строка предваряется значением длины строки, которое представляет 7-битное целое число
С чтением бинарных данных все просто: соответствующий метод считывает данные определенного типа и перемещает указатель на размер этого типа в байтах, например, значение типа int занимает 4 байта, поэтому BinaryReader считает 4 байта и переместит указатель на эти 4 байта.
Например, выше в примере с BinaryWriter в файл person.dat записывалась строка и число. Считаем их с помощью BinaryReader:
Конструктор класса BinaryReader также в качестве параметра принимает объект потока, только в данном случае устанавливаем в качестве режима FileMode.Open: new BinaryReader(File.Open(«person.dat», FileMode.Open)) .
В каком порядке данные были записаны в файл, в таком порядке мы их можем оттуда считать. То есть если сначала записывалась строка, а потом число, то в данном порядке мы их можем считать из файла.
Или подобным образом считаем данные из файла people.dat, который был записан в примере выше и который содержит данные объектов Person:
Здесь в цикле while считываем данные. Чтобы узнать окончание потока, вызываем метод PeekChar() . Этот метод считывает следующий символ и возвращает его числовое представление. Если символ отсутствует, то метод возвращает -1, что будет означать, что мы достигли конца файла.
В цикле последовательно считываем значения для свойств объектов Person в том же порядке, в каком они записывались.
C Language
Файлы и потоки ввода-вывода
Модификации режима в fopen() и freopen() могут быть одним из следующих значений:
- "r" : открыть файл в режиме только для чтения, при этом курсор установлен в начало файла.
- "r+" : открыть файл в режиме чтения-записи, при этом курсор установлен в начало файла.
- "w" : открыть или создать файл в режиме только для записи, при этом его содержимое обрезается до 0 байтов. Курсор установлен в начало файла.
- "w+" : открыть или создать файл в режиме чтения-записи, при этом его содержимое обрезается до 0 байтов. Курсор установлен в начало файла.
- "a" : открыть или создать файл в режиме только записи, при этом курсор установлен в конец файла.
- "a+" : открыть или создать файл в режиме чтения-записи, при этом указатель чтения установлен в начало файла. Выход, однако, всегда будет добавлен в конец файла.
Каждый из этих файловых режимов может иметь b добавленный после начальной буквы (например, "rb" или "a+b" или "ab+" ). b означает, что файл следует рассматривать как двоичный файл вместо текстового файла в тех системах, где есть разница. Это не влияет на Unix-подобные системы; это важно для систем Windows. (Кроме того, Windows fopen позволяет явному t вместо b указывать «текстовый файл» и множество других параметров для конкретной платформы.)
- "wx" : создать текстовый файл в режиме только для записи. Файл может не существовать .
- "wbx" : создать двоичный файл в режиме только для записи. Файл может не существовать .
x , если присутствует, должен быть последним символом в строке режима.
Открыть и записать в файл
Эта программа открывает файл с именем, указанным в аргументе main, по output.txt для output.txt если аргумент не указан. Если файл с тем же именем уже существует, его содержимое отбрасывается, и файл рассматривается как новый пустой файл. Если файлы еще не существуют, создается вызов fopen() .
Если по какой-либо причине вызов fopen() завершился с ошибкой, он возвращает значение NULL и устанавливает значение глобальной переменной errno . Это означает, что программа может проверить возвращаемое значение после вызова fopen() и использовать perror() если fopen() терпит неудачу.
Если вызов fopen() завершается успешно, он возвращает действительный указатель FILE . Этот указатель затем может использоваться для ссылки на этот файл до тех пор, пока на нем не будет fclose() .
Функция fputs() записывает данный текст в открытый файл, заменяя любое предыдущее содержимое файла. Аналогично функции fopen() функция fputs() также устанавливает значение errno если она терпит неудачу, хотя в этом случае функция возвращает EOF для указания отказа (иначе он возвращает неотрицательное значение).
Функция fclose() сбрасывает любые буферы, закрывает файл и освобождает память, на которую указывает FILE * . Возвращаемое значение указывает на завершение так же, как и fputs() (хотя при успешном завершении возвращает «0»), снова также устанавливая значение errno в случае сбоя.
fprintf
Вы можете использовать fprintf в файле так же, как на консоли с printf . Например, чтобы отслеживать выигрыши игр, потери и связи, которые вы могли бы написать
Замечание: некоторые системы (печально, Windows) не используют то, что большинство программистов назвали бы «нормальными» окончаниями строк. Хотя UNIX-подобные системы используют \ n для завершения строк, Windows использует пару символов: \ r (возврат каретки) и \ n (строка). Эта последовательность обычно называется CRLF. Однако при использовании C вам не нужно беспокоиться об этих деталях, зависящих от платформы. AC-компилятор необходим для преобразования каждого экземпляра \ n в правильную конечную строку платформы. Поэтому компилятор Windows будет конвертировать \ n в \ r \ n, но компилятор UNIX сохранит его как есть.
Выполнить процесс
Эта программа запускает процесс ( netstat ) через popen() и считывает весь стандартный вывод процесса и выводит его на стандартный вывод.
Примечание: popen() не существует в стандартной библиотеке C , но это скорее часть POSIX C )
Получить строки из файла с помощью getline ()
Библиотека POSIX C определяет функцию getline() . Эта функция выделяет буфер для хранения содержимого строки и возвращает новую строку, количество символов в строке и размер буфера.
Пример программы, которая получает каждую строку из example.txt :
Входной файл example.txt
Выход
В этом примере getline() изначально вызывается без выделенного буфера. Во время этого первого вызова getline() выделяет буфер, считывает первую строку и помещает содержимое строки в новый буфер. При последующих вызовах getline() обновляет один и тот же буфер и перераспределяет буфер только тогда, когда он больше не достаточно большой, чтобы соответствовать всей строке. Затем временный буфер освобождается, когда мы закончили с файлом.
Другой вариант — getdelim() . Это то же самое, что и getline() за исключением указания символа окончания строки. Это необходимо, только если последний символ строки для вашего типа файла не является \ n. getline() работает даже с текстовыми файлами Windows, потому что с завершением многобайтовой строки ( "\r\n") '\ n'` по-прежнему остается последним символом в строке.
Пример реализации getline()
Открыть и записать в двоичный файл
Эта программа создает и записывает текст в двоичной форме через функцию fwrite в файл output.bin .
Если файл с тем же именем уже существует, его содержимое отбрасывается, и файл рассматривается как новый пустой файл.
Бинарный поток представляет собой упорядоченную последовательность символов, которая может прозрачно записывать внутренние данные. В этом режиме байты записываются между программой и файлом без какой-либо интерпретации.
Чтобы записывать целые числа переносимым образом, необходимо знать, ожидает ли формат файла их в формате большой или малой длины, а также размер (обычно 16, 32 или 64 бита). Бит-сдвиг и маскирование могут затем использоваться для записи байтов в правильном порядке. Целые числа в C не гарантируют наличие двух дополняющих представлений (хотя почти все реализации выполняются). К счастью, преобразование в беззнаковый гарантированно использовать двойки комплемента. Поэтому код для записи знакового целого в двоичный файл немного удивителен.
Другие функции следуют одному и тому же шаблону с незначительными изменениями для размера и порядка байтов.
fscanf ()
Предположим, у нас есть текстовый файл, и мы хотим прочитать все слова в этом файле, чтобы выполнить некоторые требования.
file.txt :
Это основная функция:
Чтение строк из файла
Заголовок stdio.h определяет функцию fgets() . Эта функция считывает строку из потока и сохраняет ее в указанной строке. Функция прекращает чтение текста из потока, когда считывается n — 1 символ, читается символ новой строки ( '\n' ) или заканчивается конец файла (EOF).
Вызов программы с аргументом, который представляет собой путь к файлу, содержащему следующий текст:
Результатом будет следующий вывод:
Этот очень простой пример позволяет фиксированную максимальную длину строки, так что более длинные строки будут эффективно считаться двумя строками. Функция fgets() требует, чтобы вызывающий код предоставлял память, которая будет использоваться в качестве адресата для прочитанной строки.
POSIX делает доступной функцию getline() которая вместо этого внутренне выделяет память, чтобы увеличить буфер, если необходимо, для линии любой длины (при условии, что имеется достаточная память).