@dandropov95

Как записать число в файл в двоичном режиме?

int value = 11; // ... ... ... 00001011
В строковом режиме можно просто использовать fprintf(fp, "%d", value) и тогда в файл запишется символьное представление числа 11.
А как записать в файл двоичное представление числа, т.е само число а не строку.
Знаю только про методы fread/fwrite, но с помощью них можно записать только массив данных.
А как записать в файл одиночное число?
  • Вопрос задан
  • 1943 просмотра
Решения вопроса 1
@GrigorySvetov
1. Если про бинарный вывод (т.е. когда сам символ смысловой нагрузки не несет, а несет номер символа в кодировке) ("настоящий" бинарный вывод).

Основной прикол в том, что массив в Си можно понимать как просто указатель на фиксированный по размеру набор значений, а саму переменную массива - как указатель на этот набор.
И действительно, так привычное нам обращение по индексу arr[i] в Си переводится в *(arr+i) (разыменование по указателю со смещением).
Поэтому когда мы пишем fwrite(arr, ...), на самом деле мы пишем туда УКАЗАТЕЛЬ. В остальном Си достаточно всё равно, что происходит (главное чтобы без выходов на чужую память, иначе тут уже система убьет процесс). Т.е. мы передаем указатель на ЧИСЛО (одно число) как будто это целый массив, дальше всё честно для него пишем. Код получается вот такой:
#include <stdio.h>
int main(){
	FILE *fp;       //переменная файлового потока
	int value=11;   //наша переменная с числом
	fp=fopen("output.txt","wb");//открываем файл на перезапись ('w') в бинарном режиме ('b' в "wb")
	if (fp==NULL){            	     //если файл не был открыт, то...
		perror("file hadn't opened");//вывести в поток ошибок сообщение (обычно это то же, что поток вывода (т.е. экран компьюетра)

	} else {                            //иначе..
		fwrite(&value,sizeof(int),1,fp); //вывести значение как массив с единственной ячейкой
	}
	fclose(fp);//закрыть в любом случае (если fp==NULL, ошибкой всё равно не будет, а читается удобнее, чем все эти ветки if'ов
	return 0;
}


2. Если про то, что в комментарии, т.е. с ноликами и единичками в файле... Это "ненастоящий" бинарный режим, т.к. каждый символ '0' и '1' - это правда честные отдельные символы, которые надо читать как текст. В этом случае, я думаю, Вы просто это число побитно обрабатываете и fputc()'ом загоняете (но fopen() будет уже таким: fopen("<имя файла в форме строки>", "w"); (а не fopen("<имя файла в форме строки", "wb");)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Radjah
@Radjah
codewiki.wikidot.com/c:system-calls:write

Вторым параметром даёшь указатель на твой int, третьим параметром его размер (4 байта вроде бы или sizeof).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы