русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Структура данных типа file


Дата добавления: 2013-12-23; просмотров: 1718; Нарушение авторских прав


Форматное чтение из файла и функция fscanf

Обратной задачей является чтение форматированной информации из файла с ее дальнейшим преобразованием во внутреннее представление. Напишем программу, которая читает наши случайные числа из файла RAND.DAT и затем печатает их на экране дисплея. Для чтения из файла используется функция fscanf(), первым параметром которой является указатель на файловый поток, откуда будет читаться информация. Оставшиеся параметры точно такие же, как и для функции scanf().

Пример:

#include<stdio.h> main()

{

int i,r;

FILE *f;

f = fopen("rand. da t", "r") ;

for (i=0; i<100; i++)

{

fscanf(f, "d",fi r);

printf("%8d",r) ;

};

fclose(f) ;

}

 

Запустив оттранслированную программу. Вы увидите на дисплее распечатку содержимого файла RAND.DAT, но в другом формате: по 10 чисел в строке.

Не использовалась в программе проверка на конец файла. Мы знали, что в файле RAND.DAT сто чисел, и исходили из этого при написании нашей программы, когда в цикле сто раз читали число из файла.

Удаление файлов и функция unlink()

 

#include <stdio.h>

main()

{

unlink("test.dat");

}

 

Вычеркивание файлов осуществляет функция unlink (), аргументом которой является строка символов, содержащая имя вычеркиваемого файла. Аргументом может также являться указатель-константа на строку символов.

В заглавном файле STDIO.H, для совместимости с другими версиями, определен синоним remove() для функции unlink(). За один раз можно вычеркивать только один файл.

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



Отметим, что вычеркивать можно только те файлы, которые не были, открыты. Иначе файл надо сначала закрыть, а затем вычеркнуть.

Перейдем к изучению механизма обмена данными между Си-программой и файлом на диске.

В языке Си для такого обмена надо создать специальную структуру данных типа FILE, которая создается функцией fopen(). Эта структура и реализует файловый поток.

Определение этой структуры находится в заголовочном файле STDIO.H. Структура состоит из девяти компонент, причем две из них (buffer и curp) являются указателями.

Первая компонента имеет имя level. Она хранит число оставшихся в буфере непрочитанных символов-байт.

Буфером называется часть памяти (обычно размером 512 байт), через которую и осуществляется обмен, данными между программой и файлом на диске

При чтении из файла происходит чтение целого блока. Затем мы символ за символом читаем уже прочитанные данные из буфера.

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

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

#include<stdio.h>

main()

{

int с,р;

FILE *t;

t = fopen("rand.dat","r") ;

cfqetc(t);

while (c!=EOF)

{

print f ( "c %d \n", c, t->c-urp);

c = fgetc(t);

);

fclose(t) ;

}

 

Если наш файл RAND.DAT велик и не помещается целиком в буфере, то в этом случае значение указателя curp сначала будет возрастать, затем после того, как весь буфер будет опустошен (прочитан), произойдет сброс указателя curp обратно на начало буфера, и заполнение буфера следующим блоком с диска.

 

Чтение положения указателя в файле и функция ftello( )

Программа:

#include<stdio.h>

main()

{

int i,r;

long p;

FILE *f;

f = fopen ( "rand.da t", "2") ;

for (i=0;i<30; i++) ;

{

p=ftell(f) ;

printf("p=%ld",p) ;

fscanf(f, "%d", &r) ;

printf ( "r=%d\n", r);

fclose(f) ;

}

 

Эта программа открывает файл RAND.DAT и читает из него форматным способом первые тридцать чисел. Одновременно с этим перед чтением очередного числа вызывается функция ftell() аргументом, который является указателем на файловый поток. Начинается нумерация с нуля, то есть когда мы открыли файл, и указатель стоит на самом первом байте файла, то значение файлового указателя равно нулю.

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

Файловый указатель есть фактически счетчик числа прочитанных байт. А буферный указатель есть адрес байта в оперативной памяти.

Связь между указателями есть число уже прочитанных байт (файловый указатель) равно произведению числа прочитанных блоков из файла, умноженных на размер блока, плюс число байт уже прочитанных из файлового буфера. Но число прочитанных из буфера байт равно разности между значением текущего указателя и указателя на начало буфера buffer.

Установка указателя в начало файла и функция rewind()

Пример: спустя некоторое время после открытия файла и работы с ним, восстановить исходное положение указателя.

 

#include <stdio.h>

main()

{

int i,r;

long p;

FILE *f;

f = fopen ( "rand, da t" , "r") ;

for (f=0; f<30; f++)

{ p=ftell(f);

printf("p=%ld",p);

fscant(f, "d",&r);

printf("r =%d\n",r);

};

rewind(f) ;

print f ( " \n REPETING. . . \n ") ;

for (i = =0; i<30; i++)

{ p=ftell(f);

fscanf(f, "%d",&r) ;

printf("r =%d \n",r);

for (i=100; i>-l; i--)

{

fseek(f,1,0) ;

r=fgetc (f) ;

printf("c",r);

}

fclose(f) ;

}

 

Из текста программы видно, что цикл организован с "обратным счетом по переменной f, с начальным значением 100 и конечным 0. Вызов функции fseek() приводит к тому, что файловый указатель устанавливается в положение, указывающее на первый байт от начала файла.



<== предыдущая лекция | следующая лекция ==>
Побайтная запись в файл и функция fputco | Вставка в середину файла


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 2.475 сек.