Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Работа с файлами в Си


Рекомендуемые сообщения

Привет!

Я хочу сделать вывод массива, структуры, да и просто переменной в двоичный файл.

Как это сделать?

Ну открываем файл для записи. Но как выводить в него в двоичном формате?

ПРобовал открыть файл в бинарном режиме w+b, но в файл выводятся переменные как текст, т.е. если блокнотом открыть этот файл, то там видно значения переменных!

А, еще забыл: Как потом из этого двоичного файла читать значения и выводить их в десятичном формате (ну в текстом или как лучше сказать)

Ссылка на комментарий
Поделиться на другие сайты

Бумер:

А что такое двоичный файл? :doh:

"Как вы яхту назовете, так она и поплывет..." (Приключения капитана Врунгеля).

Если ты выводишь в файл переменные как текст, будь файл хоть трижды двоичным, они там будут как текст. А если ты хочешь выводить машинное представление, например, целых чисел, то пользуйся функциями вывода и ввода содержания памяти без преобразования (для обычных целых, например - putw и getw, они выводят по два байта). Тогда в редакторе ты увидишь не выведенные в файл числа, а символы, соответствующие их представлению в памяти. А для массивов и структур вместо putw и getw используй fwrite и fread - они работают почти с любым размером переменных, но список параметров у них соответственно сложнее.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Тролль

Если ты выводишь в файл переменные как текст, будь файл хоть трижды двоичным, они там будут как текст

Переменная типа char в языке си рассматривается и как число и как символ, верно?

Но почему же когда я вывожу символ то он и есть символ?????

Ссылка на комментарий
Поделиться на другие сайты

Бумер:

Переменная типа char в языке си рассматривается и как число и как символ, верно?
Верно.
Но почему же когда я вывожу символ то он и есть символ?????
Неверно, если ты имеешь в виду вывод в файл. А если ты выводишь символ на экран, то он символ потому, что ты объявил компьютеру, что он символ. Объявил, использовав функцию или формат, подразумевающие, что то, с чем они работают - символы.

С не так жестко типизирован, как Pascal. Поэтому и переменные char можно использовать двумя способами. Будешь обращаться с char, как с числом - можешь считать его числом. Будешь обращаться как с символом - можешь считать его символом. На самом деле это все равно не число и не символ - это байт, т.е. машинное представление символа или числа.

В компьютере нет чисел или символов, в нем есть только биты. "Но нет Востока, и Запада нет, что - племя, родина, род, Когда сильный с сильным лицом к лицу у края земли встает..." Только биты имеют значение, остальное - интерпретация.

Пример: ты выводишь в файл символ "0". Его машинное представление - 00110000. В файле будет храниться не символ, а именно эта последовательность битов. Затем ты вводишь ее обратно. Что это - десятичное число 48 или символ "0" или позиция двухклеточного корабля в игре "Морской бой" - знаешь только ты. В соответствии с твоими представлениями о том, что должен обозначать этот байт, ты при вводе назначаешь ему какой-то тип и программируешь какие-то операции с этим байтом.

Текстовый редактор, например, при обработке файла предполагает, что байты в файле - машинные представления символов.

Кстати, для смены типа данных, то есть подразумеваемого вида информации, не обязательно делать ввод-вывод в файл. Как в C, так и во всех реализациях Pascal есть как автоматическое, так и явно указываемое преобразование типов данных.

Ссылка на комментарий
Поделиться на другие сайты

Тролль извини, что так долго тормозил и не спрашивал, что ты скорее всего забыл суть дела)))

Но почему же когда я вывожу символ то он и есть символ?????

Неверно, если ты имеешь в виду вывод в файл.

НУ смотри, вот есть код

#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-переменную, то в файле и есть 'А'?

Ссылка на комментарий
Поделиться на другие сайты

Ты ввел в файл два байта машинного представления целой переменной со значением 5 и затем один байт машинного представления символа A, а читаешь затем в текстовом редакторе все эти байты как представляющие, каждым из байтов, отдельные символы.

В файле у тебя находится последовательность битов

000001010000000001000001

Первые 16 битов - это машинное представление числа 5, следующие 8 битов - машинное представление символа A.

Дальше ты читаешь эти 24 бита в текстовом редакторе, который истолковывает их как 3 байта, соответствующие 3 символам текста, которые надо показать на экране. Первый символ - с кодом 5 (двоичное представление 00000101), это служебный символ, у него есть рисунок вроде псевдографики. Второй символ - с кодом 0, это тоже служебный символ, у этого символа вообще нет рисунка, соответственно ничего не показывется. Третий символ - с кодом 41, этот символ имеет рисунок буквы A, она и показывается.

Другими словами: поскольку третий байт представлял символ A, он, если байты представлять как коды символов, и расшифровался как символ A. Первые два байта представляли собой исходно не коды символов, поэтому, если считать их кодами символов, получились какие-то символы без осмысленного значения.

То есть в файле - обезличенная последовательность битов. В файле (как и вообще в компьютере, кстати) нет ни символов, ни чисел, ни табуреток. Там только биты, а что именно они представляют, зависит от того, кто их читает и интерпретирует. Текстовый редактор расшифровал их как коды трех идущих друг за другом символов. А если программу пишешь ты, ты сам определяешь написанными тобой командами, как интерпретировать эти биты.

Компьютер - не вычислительная машина, точнее, не только вычислительная машина. Это машина для выполнения логических операций над цепочками битов. Ее легко приспособить для арифметических вычислений, поскольку числа легко представить цепочками битов, и название осталось от тех времен, когда компьютеры служили только для этого, но это только одно из применений их возможностей. Поэтому цепочки битов в компьютере могут интерпретироваться как угодно - как числа, символы, звуки, изображения... Использовав для чтения файла текстовый редактор, ты просто интерпретировал первые два байта не в том смысле, какой у них был, когда они записывались.

P.S. Ошибся на нолик в цепочке битов, подправил.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...