Считывание всего файла, глава 3

Третья часть учебных материалов, размещенных harleyg на форуме PSP-Programming.com (первоначально опубликованные под заголовком «Общий C код»).

Теперь, когда мы завершили программу, мы проверим размер файла:

fseek (pFile, 0, SEEK_END);
lSize = ftell (pFile);
rewind (pFile);

fseek — «устанавливает индикатор текущей позиции в файле для потока, указанного параметром stream. Наверно, вы догадались, что данная функция «ищет» позицию файла. Fseek имеет три аргумента: указатель на открытый файл, смещение (количество байтов относительно начала файла) и источник (или конец).
(…) — в круглые скобки включают аргументы.
pFile – переменная, которая содержит указатель на файл, открытый нами ранее.
0 – смещение Ноль означает, что мы хотим начать запуск с начала.
SEEK_END — отчитываем позицию до конца файла.
lSize = ftell (pFile); — сохраняем возвращаемое значение ftell() в lSize.
ftell(pFile); — возвращает текущую позицию потока (stream). ftell имеет только один аргумент: указатель на открытый файл. В этом случае это pFile. Основная функция ftell – сообщить вам о количестве байтов относительно конкретной позиции. Поскольку мы находимся в конце (считываем до конца с fseek), то нам сообщается размер файла.
rewind (pFile); — функция перемотки заново открывает файл с начала. Она имеет только один аргумент, указатель на начало файла. Таким образом, файл запущен для повторного использования.

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

Далее выделяем необходимое количество памяти для соответствующего файла:

buffer = (char*) malloc (lSize);
if (buffer == NULL) sceKernelExitGame();

buffer = — устанавливаем значение переменной, равное «buffer. «
char * — вызывает malloc для сообщения о том, что содержит символы.
malloc — функция для выделения памяти (например, malloc(56); предоставит вам 56 байтов памяти для хранения информации). Поэтому malloc (lSize) выделяет место полностью для всего файла.
sceKernelExitGame() — Об этом я уже упоминал ранее: необходимо для проверки свободного места в файле.

Итак, мы успешно открыли файл, проверили его размер и выделили необходимое количество памяти. Далее копируем содержимое файла в буфер обмена (память):

fread(buffer, 1, lSize, pFile);

fread — «Считывание блока данных из файла в буфер обмена».
Данная функция имеет 4 аргумента:
buffer — первый аргумент, который называют «buffer» (буфер). Это место, где мы храним информацию.
1 — второй аргумент. Это размер («size «) в байтах, каждый из которых будет считываться. Для символов с длиной 1 байт используем «1».
lSize — третий аргумент, «количество». То есть количество символов, подлежащие считыванию в буфере. В нашем случае lSize – размер файла.
pFile — четвертый и последний аргумент, «поток». То есть указатель на открытие файла, у нас – pFile.

Отлично, только что мы прочитали файл в память. У нас есть строка файла в нашей переменной «buffer «. Теперь мы должны закрыть файл, так как больше он нам не понадобится. Если вы не сделаете этого, то могут возникнут проблемы, поэтому закрываем:

fclose(pFile);

fclose (pFile); — «сбрасывает любые буферы, сохраняемые для данного файла, и закрывает файл». Доступно объяснил, а?

Хорошо, мы закончили третью часть! Теперь переходим к четвертой.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: