Перекодировка текстовых файлов на языке Cи



Для программиста открытый файл представляется как последовательность считываемых или записываемых данных. При открытии файла с ним связывается поток ввода-вывода. Выводимая информация записывается в поток, вводимая информация считывается из потока.

Когда поток открывается для ввода-вывода, он связывается со стандартной структурой типа FILE, которая определена в библиотеке stdio.h. Структура FILE содержит всю необходимую информацию о файле.

 

Функции работы с потоками ввода-вывода

Функция открытия потока fopen()

Открытие файла осуществляется с помощью функции fopen(), которая возвращается указатель на структуру типа FILE, который можно использовать для последующих операций с файлом.

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

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

mode – указатель на строку содержащую режим доступа к открываемому файлу.

В таблице 4.1 указаны режимы доступа к открываемому файлу.

Таблица 4.1

Режиму доступа к открываемому файлу

"r" Создает файл для записи (по умолчанию файл открывается как текстовый).
"w" Создает файл для записи (по умолчанию файл открывается как текстовый).
"а" Дописывает информацию к концу файла (по умолчанию файл открывается как текстовый).
"rb" Открывает двоичный файл для чтения.
"wb" Создает двоичный файл для записи.
"ab" Дописывает информацию к концу двоичного файла.
"r+" Открывает файл для чтения/записи (по умолчанию файл открывается как текстовый).
"w+" Создает файл для чтения/записи (по умолчанию файл открывается как текстовый).
"а+" Дописывает информацию к концу файла или создает файл для чтения/записи (по умолчанию открывается как текстовый файл).
"r+b" Открывает двоичный файл для чтения / записи.
"w+b" Создает файл для чтения / записи.
"а+b" Дописывает информацию к концу файла или создает двоичный файл для чтения.
"rt" Открывает текстовый файл для чтения.
"wt" Открывает текстовый файл для записи.
"at" Дописывает информацию к концу текстового файла.
"r+t" Открывает текстовый файл для чтения/записи.
"w+t" Создает текстовый файл для чтения/записи.
"a+t" Открывает или создает текстовый файл для чтения/записи.

 

Возвращаемое значение – указатель на открытый поток. Если обнаружена ошибка, то возвращается значение NULL.

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

 

Функция закрытия потока fclose()

int fclose (FILE *stream);

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

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

Возвращаемое значение: значение 0, если поток успешно закрыт; константа EOF (или -1), если произошла ошибка.

Ниже приведен пример

#include <stdio.h>

int main()

{

FILE *fp;

char name[]="my.txt";

if((fp = fopen(name, "r"))!=NULL) // открыть файл удалось?

{

// требуемые действия над данными

                 }

else printf("Не удалось открыть файл");

fclose(fp);

return 0;

}

 

 

Функции чтения из файла

Чтение символа из файла

int fgetc (FILE *stream);

Аргументом функции является указатель на поток типа FILE. Функция считывает один байт информации из файла и возвращает код считанного символа. Если достигнут конец файла или возникла ошибка, возвращается константа EOF.


 

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

Функция fscanf() аналогична функции scanf(), но работает с файлами данных, и имеет первый аргумент – указатель на файловый поток, а не stdin.

int fscanf (FILE *stream, char *format, ...)

fscanf(поток, "ФорматВвода", аргументы);

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

Чтение строки из файла

Функция fgets() предназначена для получения строк из файла, она является аналогом функции gets().

int fgets (char *str, int n, FILE *stream);

где str – указатель на массив, в который будет помещена считанная строка.


n – максимально допустимая длина считываемой строки.


stream – указатель на поток данных.

Символы читаются из потока до тех пор, пока не будет прочитан символ новой строки \n, который включается в строку, или пока не наступит конец потока EOF или не будет прочитано максимальное символов. Результат помещается в указатель на строку и заканчивается нуль-символом \0. Функция возвращает адрес строки, куда была размещена считанная из файла информация.

 

Чтение блока данных из файла

size_t fread( void *buf, size_t size, size_t count, FILE *stream);

Функция fread считывает из потока stream массив размером count элементов, каждый из которых имеет размер size байт и сохраняет его в блоке памяти, на который указывает buf. Индикатор положения потока увеличивается на общее число записанных байтов.

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

 

Функции записи в файл

Запись символа в файл fputc()

int fputc (int ch, FILE *stream);

ch – код выводимого символа;

stream – указатель на поток данных.

Функция fputc() записывает символ ch в указанный поток в позицию, соответствующую текущему значению указателя положения в файле stream, а затем дает приращение указателю положения в файле. Даже если ch был объявлен как int, он конвертируется функцией fputc() в тип данных unsigned char.

Функция fputc() возвращает значение записанного символа. В случае ошибки при запись она возвращается EOF.

 

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

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

int fprintf(FILE *stream, const char * format,...);

fprintf(поток, "ФорматВывода", аргументы);

Функция fprint f() выводит значения аргументов, составляющих список аргументов, в формате, указанном в строке format, в поток, на который указывает stream. Возвращает количество записанных литер либо отрицательное значение в случае ошибки.

 

Запись строки в файл

Функция fputs() предназначена для ввода в файл строки. Она является аналогом функции puts().

int fputs(const char *str, FILE *stream);

str – указатель на выводимую строку.


stream – указатель на поток данных.

Копирует строку в поток с текущей позиции. Завершающий нуль-символ \0 в этом случае не копируется.


В случае успеха функция fputs() возвращает последний записанный символ, а в случае неудачи EOF.

 

Запись блока данных в файл

size_t fwrite(const void *buf, size_t size, size_t count, FILE *stream );

Функция fwrite() записывает count блоков – каждый из которых по size символов в длину в поток, указанный в stream, из массива, указанного в аргументе buf. Индикатор положения потока увеличивается на общее число записанных байтов.

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

 

Функции позиционирования


Дата добавления: 2020-01-07; просмотров: 352; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!