2014-01-05 1 views
-1

Я знаю, что указатель - это переменная, которая хранит адрес другой переменной. Поэтому я понял понятия указателей типа char, указатели целых типов, что происходит, когда мы добавляем их в указатель и т. Д. Но я не получил реальной концепции указателя файла. Почему мы не можем напрямую указывать на них, как в случае символьных типов данных? Например, рассмотрите файл с контентом:Какова концепция указателя файла или указателя потока?

Путь к этому файлу - 'ptr'. Почему мы не можем использовать технику ptr, чтобы указать «H», (ptr + 1) на «e», (ptr + 2) на «l» и так далее. Если мой вопрос глуп, простите, иногда становится ясно, понимаю ли я реальное понятие. Я думаю, что этот файл фактически хранится в памяти так же, как строка хранится в памяти. (Я знаю функцию fscanf() и все)

ответ

2

Есть что-то под названием memory mapped file, но это обособленно, вы можете достичь того, чего хотите (если бы я его правильно понял), просто открыв файл и загрузив его в буфер (который, кстати, является обычным способом чтения данных из файлов).

Один раз в памяти вы получаете первый байт с *buf, второй - с *(buf+1) и так далее; или, как правило, лучше с ясности, с buf[0], buf[1] и так далее.

Почему вы не можете, если вы не используете файл с отображением памяти? Поскольку то, что у вас есть при открытии файла в C (с использованием fopen), является непрозрачным указателем (то есть указателем, указывающим на неизвестные вам данные, вы должны рассматривать его как «концепцию», а не фактические данные, которые вы можете прочитать), позволяя другим функциям (fread, fwrite, fseek и т. д.), чтобы «работать» с этим файлом, который вы открыли, но этот указатель не «содержит» байты файла. Он называется иногда обработчиком по причине: он позволяет «обрабатывать» файл.

Используя этот непрозрачный указатель FILE*, вы можете читать байты из этого файла в памяти, затем вы можете обрабатывать данные в памяти.

0

Я думаю, вы говорите в контексте языка C. Нет, файл фактически не хранится в памяти. Подумайте о указателе файла, например. как указатель/стрелка, которая показывает вам, как далеко вы находитесь в процессе чтения этого файла. Это означает, что если вы сейчас выполняете операцию чтения, указатель сообщает вам, какой символ/int и т. Д. Вы будете читать из этого файла, то есть где вы сейчас находитесь. Для этого и предназначен указатель. Это мой способ грубо и неформально объяснить это.

+0

Но я ожидаю, что файл будет загружен в память, поскольку я узнал, что он должен быть загружен в память перед выполнением –

0

Я предполагаю, что основная причина, по которой я не ожидал бы, чтобы ptr + 1 дал мне второй символ файла, состоит в том, что в общем случае в C арифметика указателя перемещает вас одним объектом, а не одним байтом; поэтому я ожидал бы, что ptr + 1 укажет на «следующий» файл, независимо от того, что это значит (если что-нибудь).

И файлы обычно хранятся на диске, а не в памяти.

0

Файл не хранится в памяти. Его можно принести в память (или ее части), когда вы его открываете. Файлы не являются частью данных вашей программы, они всего лишь сущность, которую вы можете использовать с помощью операционной системы.

Существует гораздо больше файлов по сравнению с обычными массивами символов в памяти. Чтение и запись в файлы обычно буферизуется, это обрабатывается стандартной библиотекой C library FILE, которая позволяет вам вызывать операции над файлом.

А что могло бы означать наличие «указателя на файл»? Видите ли, ptr+1 для сканирования через файл не является хорошим выбором по многим причинам. Если это двоичные данные, что именно вы ожидаете от ptr+1? Что делать, если вы хотите читать более крупные фрагменты данных, например, строки за раз?

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

Еще одним важным моментом является то, что семантика ptr+1 имеет смысл только для встроенных типов языков. Файл не является встроенным типом, и это не имеет смысла.

 Смежные вопросы

  • Нет связанных вопросов^_^