Бумер Опубликовано 7 декабря, 2007 Жалоба Поделиться Опубликовано 7 декабря, 2007 Привет! Я хочу сделать вывод массива, структуры, да и просто переменной в двоичный файл. Как это сделать? Ну открываем файл для записи. Но как выводить в него в двоичном формате? ПРобовал открыть файл в бинарном режиме w+b, но в файл выводятся переменные как текст, т.е. если блокнотом открыть этот файл, то там видно значения переменных! А, еще забыл: Как потом из этого двоичного файла читать значения и выводить их в десятичном формате (ну в текстом или как лучше сказать) Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 8 декабря, 2007 Жалоба Поделиться Опубликовано 8 декабря, 2007 (изменено) Бумер: А что такое двоичный файл? :doh: "Как вы яхту назовете, так она и поплывет..." (Приключения капитана Врунгеля). Если ты выводишь в файл переменные как текст, будь файл хоть трижды двоичным, они там будут как текст. А если ты хочешь выводить машинное представление, например, целых чисел, то пользуйся функциями вывода и ввода содержания памяти без преобразования (для обычных целых, например - putw и getw, они выводят по два байта). Тогда в редакторе ты увидишь не выведенные в файл числа, а символы, соответствующие их представлению в памяти. А для массивов и структур вместо putw и getw используй fwrite и fread - они работают почти с любым размером переменных, но список параметров у них соответственно сложнее. Изменено 8 декабря, 2007 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
Бумер Опубликовано 9 декабря, 2007 Автор Жалоба Поделиться Опубликовано 9 декабря, 2007 Тролль Если ты выводишь в файл переменные как текст, будь файл хоть трижды двоичным, они там будут как текст Переменная типа char в языке си рассматривается и как число и как символ, верно? Но почему же когда я вывожу символ то он и есть символ????? Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 9 декабря, 2007 Жалоба Поделиться Опубликовано 9 декабря, 2007 Бумер: Переменная типа char в языке си рассматривается и как число и как символ, верно?Верно. Но почему же когда я вывожу символ то он и есть символ?????Неверно, если ты имеешь в виду вывод в файл. А если ты выводишь символ на экран, то он символ потому, что ты объявил компьютеру, что он символ. Объявил, использовав функцию или формат, подразумевающие, что то, с чем они работают - символы. С не так жестко типизирован, как Pascal. Поэтому и переменные char можно использовать двумя способами. Будешь обращаться с char, как с числом - можешь считать его числом. Будешь обращаться как с символом - можешь считать его символом. На самом деле это все равно не число и не символ - это байт, т.е. машинное представление символа или числа. В компьютере нет чисел или символов, в нем есть только биты. "Но нет Востока, и Запада нет, что - племя, родина, род, Когда сильный с сильным лицом к лицу у края земли встает..." Только биты имеют значение, остальное - интерпретация. Пример: ты выводишь в файл символ "0". Его машинное представление - 00110000. В файле будет храниться не символ, а именно эта последовательность битов. Затем ты вводишь ее обратно. Что это - десятичное число 48 или символ "0" или позиция двухклеточного корабля в игре "Морской бой" - знаешь только ты. В соответствии с твоими представлениями о том, что должен обозначать этот байт, ты при вводе назначаешь ему какой-то тип и программируешь какие-то операции с этим байтом. Текстовый редактор, например, при обработке файла предполагает, что байты в файле - машинные представления символов. Кстати, для смены типа данных, то есть подразумеваемого вида информации, не обязательно делать ввод-вывод в файл. Как в C, так и во всех реализациях Pascal есть как автоматическое, так и явно указываемое преобразование типов данных. Ссылка на комментарий Поделиться на другие сайты Поделиться
Бумер Опубликовано 13 декабря, 2007 Автор Жалоба Поделиться Опубликовано 13 декабря, 2007 Тролль извини, что так долго тормозил и не спрашивал, что ты скорее всего забыл суть дела))) Но почему же когда я вывожу символ то он и есть символ????? Неверно, если ты имеешь в виду вывод в файл. НУ смотри, вот есть код #include <stdio.h>int main(){int c;FILE *f;f=fopen("D:/f.bin","wb");c=5;putw(c,f);char s;s='A';putw(s,f);fclose(f);} В результате работы этой программы имеем при открытии файла через блокнот: "[непонятный символ]A" где [непонятный симовл] - квадратик (по ходу дела - псевдографика). Вопрос, почему, когда я вывел переменную типа int в файл, то там - непонятный символ, а когда вывел char-переменную, то в файле и есть 'А'? Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 13 декабря, 2007 Жалоба Поделиться Опубликовано 13 декабря, 2007 (изменено) Ты ввел в файл два байта машинного представления целой переменной со значением 5 и затем один байт машинного представления символа A, а читаешь затем в текстовом редакторе все эти байты как представляющие, каждым из байтов, отдельные символы. В файле у тебя находится последовательность битов 000001010000000001000001 Первые 16 битов - это машинное представление числа 5, следующие 8 битов - машинное представление символа A. Дальше ты читаешь эти 24 бита в текстовом редакторе, который истолковывает их как 3 байта, соответствующие 3 символам текста, которые надо показать на экране. Первый символ - с кодом 5 (двоичное представление 00000101), это служебный символ, у него есть рисунок вроде псевдографики. Второй символ - с кодом 0, это тоже служебный символ, у этого символа вообще нет рисунка, соответственно ничего не показывется. Третий символ - с кодом 41, этот символ имеет рисунок буквы A, она и показывается. Другими словами: поскольку третий байт представлял символ A, он, если байты представлять как коды символов, и расшифровался как символ A. Первые два байта представляли собой исходно не коды символов, поэтому, если считать их кодами символов, получились какие-то символы без осмысленного значения. То есть в файле - обезличенная последовательность битов. В файле (как и вообще в компьютере, кстати) нет ни символов, ни чисел, ни табуреток. Там только биты, а что именно они представляют, зависит от того, кто их читает и интерпретирует. Текстовый редактор расшифровал их как коды трех идущих друг за другом символов. А если программу пишешь ты, ты сам определяешь написанными тобой командами, как интерпретировать эти биты. Компьютер - не вычислительная машина, точнее, не только вычислительная машина. Это машина для выполнения логических операций над цепочками битов. Ее легко приспособить для арифметических вычислений, поскольку числа легко представить цепочками битов, и название осталось от тех времен, когда компьютеры служили только для этого, но это только одно из применений их возможностей. Поэтому цепочки битов в компьютере могут интерпретироваться как угодно - как числа, символы, звуки, изображения... Использовав для чтения файла текстовый редактор, ты просто интерпретировал первые два байта не в том смысле, какой у них был, когда они записывались. P.S. Ошибся на нолик в цепочке битов, подправил. Изменено 13 декабря, 2007 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения