11. Файловый ввод-вывод. Работа с текстовыми и двоичными файлами - polpoz.ru o_O
Главная
Поиск по ключевым словам:
страница 1
Похожие работы
Название работы Кол-во страниц Размер
Работа с файлами в формате raw 1 137.16kb.
4. Ввод-вывод и файловая система. Файл С. из 1 182.33kb.
Самостоятельная работа (задания 1-2) Упражнение 1 1 30.64kb.
Методические указания к курсовой работе по дисциплине «Программирование... 1 56.93kb.
«Наименьшее общее кратное» 1 58.51kb.
Графічний редактор і його призначення. Робота з графічними файлами. 1 33.42kb.
Для проведения тестирования системы ктс егэ в системе КуМир (версия... 1 25.24kb.
Ввод информации в память компьютера. Клавиатура. Группы клавиш 1 45.15kb.
Открытие и закрытие файлов 1 31.89kb.
Помощь по вопросу о задачах, решаемых в проектируемой сети 1 68.8kb.
К рабочей программе учебной практики профессионального модуля «ввод... 1 37.05kb.
Настоящая программа рассчитана изучение базового курса информатики... 1 309.81kb.
1. На доске выписаны n последовательных натуральных чисел 1 46.11kb.

11. Файловый ввод-вывод. Работа с текстовыми и двоичными файлами - страница №1/1

11. Файловый ввод-вывод. Работа с текстовыми и двоичными файлами.
Язык программирования Си поддерживает множество функций стандартных библиотек для файлового ввода и вывода. Эти функции составляют основу заголовочного файла стандартной библиотеки языка Си <stdio.h>.

Функциональность ввода-вывода языка Си по текущим стандартам реализуется на низком уровне. Язык Си абстрагирует все файловые операции, превращая их в операции с потоками байтов, которые могут быть как "потоками ввода", так и "потоками вывода". В отличие от некоторых ранних языков программирования, язык Си не имеет прямой поддержки произвольного доступа к файлам данных; чтобы считать записанную информацию в середине файла, программисту приходится создавать поток, ищущий в середине файла, а затем последовательно считывать байты из потока.

Потоковая модель файлового ввода-вывода была популяризирована во многом благодаря операционной системе Unix, написанной на языке Си. Большая функциональность современных операционных систем унаследовала потоки от Unix, а многие языки семейства языков программирования Си унаследовали интерфейс файлового ввода-вывода языка Си с небольшими отличиями (например, PHP). Стандартная библиотека C++ отражает потоковую концепцию в своем синтаксисе.

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

Функция freopen закрывает текущий файл, связанный с потоком fp, и переназначает этот поток в файл, определяемый path-именем. Эта функция обычно применяется для переадресации предоткрытых потоков stdin, stdout, stderr, stdaux, stdprn в файлы, определяемые пользователем. Новый файл, связанный с потоком, открывается в режиме mode.

Они определяются как:

FILE *fopen(const char *path, const char *mode);

FILE *freopen(const char *path, const char *mode, FILE *fp);

Функция fopen по сути представляет собой "обертку" более высокого уровня системного вызова open операционной системы Unix. Аналогично, fclose является оберткой системного вызова Unix close, а сама структура FILE языка Си зачастую обращается к соответствующему файловому дескриптору Unix. В POSIX-окружении[ Portable Operating System Interface for Unix — Переносимый интерфейс операционных систем Unix — набор стандартов, описывающих интерфейсы между операционной системой и прикладной программой.] функция fopen может использоваться для инициализации структуры FILE файловым дескриптором. Тем не менее, файловые дескрипторы как исключительно Unix-концепция не представлены в стандарте языка Си.



Параметр mode (режим) для fopen и freopen должен быть строковый и начинаться с одной из следующих последовательностей:

режим

описание

начинает с..

r

rb




открывает для чтения

начала

w

wb




открывает для записи (создает файл в случае его отсутствия). Удаляет содержимое и перезаписывает файл.

начала

a

ab




открывает для добавления (создает файл в случае его отсутствия)

конца

r+

rb+

r+b

открывает для чтения и записи

начала

w+

wb+

w+b

открывает для чтения и записи. Удаляет содержимое и перезаписывает файл.

начала

a+

ab+

a+b

открывает для чтения и записи (добавляет в случае существования файла)

конца

Значение "b" зарезервировано для двоичного режима С. Стандарт языка Си описывает два вида файлов — текстовые и двоичные — хотя операционная система не требует их различать. Текстовый файл - файл, содержащий текст, разбитый на строки при помощи некоторого разделяющего символа окончания строки или последовательности (в Unix - одиночный символ перевода строки; в Microsoft Windows за символом перевода строки следует знак возврата каретки). При считывании байтов из текстового файла, символы конца строки обычно связываются (заменяются) с переводом строки для упрощения обработки. При записи текстового файла одиночный символ перевода строки перед записью связывается (заменяется) с специфичной для ОС последовательностью символов конца строки. Двоичный файл - файл, из которого байты считываются и выводятся в "сыром" виде без какого-либо связывания (подстановки).

При открытом файле в режиме обновления ( '+' в качестве второго или третьего символа аргумента обозначения режима) и ввод и вывод могут выполняться в одном потоке. Тем не менее, запись не может следовать за чтением без промежуточного вызова fflush или функции позиционирования в файле (fseek, fsetpos или rewind), а чтение не может следовать за записью без промежуточного вызова функции позиционирования в файле.

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

Закрытие файла осуществляется с помощью функции fclose . Функция fclose принимает один аргумент: указатель на структуру FILE потока для закрытия.

int fclose(FILE *fp);

Функция возвращает нуль в случае успеха и EOF в случае неудачи. При нормальном завершении программы функция вызывается автоматически для каждого открытого файла.

Чтение файла при помощи fgetc. Функция fgetc применяется для чтения символа из потока.


int fgetc(FILE *fp);

В случае успеха, fgetc возвращает следующий байт или символ из потока (зависит от того, файл "двоичный" или "текстовый"). В противном случае, fgetc возвращает EOF. (Отдельный тип ошибок можно определить вызовом ferror или feof с указателем на файл.)


Чтение файла при помощи fgets


Функция fgets применяется для чтения строки из потока. Считывание происходит до тех пор пока не будет достигнут конец строки (hex:0D0A, эквивалентны в листингах \n) или длина строки n, в которую происходит считывание.

char *fgets(char *string, int n, FILE *fp);

Функция fgets возвращает указатель на строку string. В случае ошибки или конца файла возвращается значение NULL. Для определения того, что произошло - ошибка или конец файла, используются функции feof и ferror.

Чтение файла при помощи fread

int fread (char *buffer, int size, int count, FILE *fp);

Данная функция читает объекты размера size по счетчику count из входного потока fp и располагает их в буфере buffer. fread возвращает число действительно прочитанных объектов, которое меньше, чем count, если при чтении возникла ошибка или встретился конец файла.

Запись в файл при помощи fwrite


fwrite определяется как

int fwrite ( const char * array, size_t size, size_t count, FILE * stream );

Функция fwrite записывает блок данных в поток. Таким образом запишется массив элементов count в текущую позицию в потоке. Для каждого элемента запишется size байт. Индикатор позиции в потоке изменится на число байт, записанных успешно. Возвращаемое значение будет равно count в случае успешного завершения записи. В случае ошибки возвращаемое значение будет меньше count.

Запись в поток при помощи fputc

Функция fputc применяется для записи символа в поток.

int fputc(int c, FILE *fp);

Параметр c "тихо" конвертируется в unsigned char перед выводом. Если прошло успешно, то fputc возвращает записанный символ. Если ошибка, то fputc возвращает EOF.



Запись в поток при помощи fputs

int fputs (char *string, FILE *fp);

Функция fputs копирует строку в конец потока fp. Нулевой символ окончания '\0' не копируется. Возвращает последний записанный символ. Если вводимая строка string пустая, возвращается значение 0. Значение EOF свидетельствует об ошибке.

Форматный ввод из файла fscanf

int fscanf(FILE *fp, char *format[,arguments]);

Возвращает количество успешно проведенных преобразований. Процесс заканчивается при встрече первой неподходящей литеры или признака конца файла (EOF). Ноль на выходе означает, что не обработано ни одного поля. (format описан ниже =>)

fscanf("%i %i",&x1,&x2);



Форматный вывод в файл fprintf

int fprintf(FILE *fp, char *format[,arguments]);

Функция fprintf форматирует и печатает в выходной поток наборы символов и значений. Каждый аргумент (если он есть) преобразуется и выводится согласно заданной спецификации формата в строке формата. Строка формата (format) обладает той же формой и функцией, что и аргумент строки формата функции printf.

fprintf("Вывод = %d,%f\n",i,r);

=> Элемент формата(format) представляет собой последовательность :

% [ - ] [ длина поля ] [ . точность ] [ l ] спецификация типа

“ - “ означает сдвиг выводимых данных к левому краю поля ( по умолчанию данные сдвигаются вправо); длина поля - количество позиций для вывода; точность - количество дробных цифр для чисел или количество выводимых символов строки для строк; “ . ” - разделитель; l - означает, что число должно рассматриваться как long или double. Могут использоваться следующие спецификации типов :

d,i - для данных типа int;

u - для данных типа unsigned;

o - для данных типа unsigned (выводятся в восьмеричном виде);

x,X - для данных типа unsigned (выводятся в шестнадцатеричном виде), шестнадцатеричные цифры A,B,C,D,E,F изображаются большими буквами при использовании типа X и малыми буквами при использовании x;

c - для данных типа char, unsigned char (выводятся в символьном виде);

f - для данных типа float,double (выводятся в виде с фиксированной точкой, по умолчанию выводится 6 дробных цифр);

e,E - для данных типа float,double (выводятся в виде с плавающей точкой, по умолчанию выводится 7 цифр мантиссы и две цифры порядка, всего 13 позиций), отличаются изображением буквы E;

g,G - для данных типа float,double - величины 0.0001<|x|<1000000 выводятся в виде с фиксированной точкой с шестью значащими цифрами, другие величины выводятся с плавающей точкой с шестью значащими

цифрами (всего занимают 12 позиций), спецификации g и G различаются только изображением буквы e(E);

s - для строк;

p - для данных типа указатель.

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

#include

int main (){

FILE *file;

char *fname = "file.txt";

file = fopen(fname,"r");

if(file == 0){ //проверка на успешное открытие файла

printf("не могу открыть файл '%s'",fname);

return 0;

}

char ch;



while((ch = fgetc(file))!=EOF) //читать пока не конец файла

fputc(ch, stdout); //вывод на экран(stdout-поток стандартного вывода, в нашем случае окно консоли)

fclose(file);

return 0;



}