Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (1)

Лучшие ответы пользователя

Все ответы (2)
  • Как записать число в файл в двоичном режиме?

    @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 комментарий