Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Функции для модификации содержимого файла

Функция

int putc (int символ, FILE * указатель_на _файл);

записывает один символ в текущую позицию указанного открытого файла. Хотя символ и определяется как int, однако записывается только младший байт (соответствующий char). Если функция выполнилась успешно, то возвращается записанный символ, иначе – EOF.

Функция

int getc (FILE * указатель_на _файл);

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

Пример: Открыть файл и записывать туда вводимые с клавиатуры символы, до тех пор, пока не будет введен символ ‘!’. Прочитать полученный файл.

#include <iostream.h>

#include <stdio.h>

#include <stdlib.h>

FILE *fl;

void flr();

void flw();

int main()

{

flr(); // Запись в файл

flw(); // Чтение из файла

return 0;

}

void flr()

{

if ((fl = fopen("lab2.dat","w"))==NULL)

{

cout << "Oshibka pri sozdanii"<<endl;

exit(1);

}

char ch;

do {

cin >> ch;

putc(ch, fl);

} while (ch!= '!');

fclose(fl);

}

void flw()

{

if ((fl = fopen("lab2.dat","r"))==NULL)

{

cout << "Oshibka pri otritii"<<endl;

exit(1);

}

char ch= getc(fl);

while (ch!= EOF)

{

cout << ch << " ";

ch=getc(fl);

}

fclose(fl);

}

 

Функция

int feof (FILE * указатель_на _файл);

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

Функция flw в предыдущем примере может выглядеть так:

void flw()

{

if ((fl = fopen("lab2.dat","r"))==NULL)

{

cout << "Oshibka pri otritii"<<endl;

exit(1);

}

while(!feof(fl)) cout << getc(fl) << " ";

fclose(fl);

}

 

Функция

int fputs (const char * строка, FILE * указатель_на _файл);

записывает строку символов в текущую позицию указанного открытого файла. В случае ошибки эта функция возвращает EOF. Нулевой символ в файл не записывается.

Функция

char * fgets (char * строка, int длина,

FILE * указатель_на _файл);

читает строку символов из текущей позиции указанного открытого файла до тех пор, пока не будет прочитан символ перехода на новую строку, или количество прочитанных символов не станет равным длина -1. Если был прочитан разделитель строк, он записывается в строку. Полученная в результате строка будет оканчиваться символом конца строки ('\0'). В случае ошибки функция возвращает NULL

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

#include <iostream.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

FILE *fl;

void fsr();

void fsw();

int main()

{

fsr(); // Запись в файл

fsw(); // Чтение из файла

return 0;

}

void fsr()

{

if ((fl = fopen("lab2.dat","w"))==NULL)

{

cout << "Oshibka pri sozdanii"<<endl;

exit(1);

}

cout << "Vvedite sytoki" << endl;

char str[80];

do {

gets(str);

strcat(str, "\n"); // добавление разделителя строк

fputs(str, fl);

} while(*str!='\n');

fclose(fl);

}

void fsw()

{

if ((fl = fopen("lab2.dat","r"))==NULL)

{

cout << "Oshibka pri otritii"<<endl;

exit(1);

}

char str[80];

while(!feof(fl))

{

if(fgets(str, 100, fl)!= NULL) cout << str;

}

fclose(fl);

}

 

Кроме основных функций ввода/вывода, также часто используются функции fprintf() и fscanf().

Функция

int * fprintf (FILE * указатель_на _файл,

const char * управляющая_строка);

записывает форматированные данные в файл. Управляющая_строка определяет строку форматирования аргументов, заданных своими адресами. Обычно эта строка состоит из последовательности символов “%”, после которых следует символ типа данных:

 

I или i Десятичное, восьмеричное или шестнадцатеричное целое
D или d Десятичное целое
U или u Десятичное целое без знака
E или e Действительное с плавающей точкой
s Строка символов
c Символ

 

Функция

int * fscanf (FILE * указатель_на _файл,

const char * управляющая_строка);

читает форматированные данные из файла. Строка форматирования строится аналогично функции fprintf.

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

Пример Запись и чтение данных из файла.

#include <iostream.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

FILE *fl;

double v; char st[81]; int n; char ch;

void fpr();

void fpw();

int main()

{

fpr(); // Запись в файл

fpw(); // Чтение из файла

return 0;

}

void fpr()

{

if ((fl = fopen("lab2.dat","w"))==NULL)

{

cout << "Oshibka pri sozdanii"<<endl;

exit(1);

}

v=3.14;

n=298;

fprintf(fl,"%s %e %d %c", "string",v,n,'x');

fclose(fl);

}

void fpw()

{

if ((fl = fopen("lab2.dat","r"))==NULL)

{

cout << "Oshibka pri otritii"<<endl;

exit(1);

}

fscanf(fl,"%s %e %d %c",st,&v,&n,&ch);

cout << st << endl;

cout << v << endl;

cout << n << endl;

cout << ch << endl;

fclose(fl);

}

 

Функция

void rewind (FILE * указатель_на _файл);

устанавливает указатель текущей позиции выделенного файла в начало файла.

 

Функция

int ferror (FILE * указатель_на _файл);

определяет, произошла ли ошибка во время работы с файлом. Она возвращает ненулевое значение (true), если при последней операции с файлом произошла ошибка; в противном же случае она возвращает 0 (false).

Функция

size_t fwrite (const void * записываемое_данное,

size_t размер_элемента, size_t число_элементов,

FILE *указатель_на _файл);

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

Функция

size_t fread (void * считываемое_данное,

size_t размер_элемента, size_t число_элементов,

FILE *указатель_на _файл);

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

Функции fread() и fwrite() при открытии файла для работы с двоичными данными могут работать с информацией любого типа.

Функция

int fileno (FILE * указатель_на _файл);

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

Функция

long filelength (int дескриптор);

возвращает длину файла с соответствующим дескриптором в байтах.

Функция

int chsize (int дескриптор, long размер);

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

Функция

long ftell (FILE * указатель_на _файл);

возвращает значение указателя на текущую позицию файла.

Функция

int fgetpos (FILE *stream, fpos_t * позиция);

определяет значение текущей позиции файла.

Функция

int fseek (FILE * указатель_на _файл, long int число_байт, int точка_отсчета);

устанавливает указатель в заданную позицию. Заданное количество байт отсчитывается от начала отсчета, которое задается следующими макросами: начало файла – SEEK_SET, текущая позиция – SEEK_CUR, конец файла – SEEK_END. При успешном завершении работы функция возвращает нуль, а в случае ошибки — ненулевое значение.

Пример: Открыть файл и записывать туда все вводимые с клавиатуры числа, до тех пор, пока не будет введено число -1. Отсортировать данные в файле по возрастанию.

#include <iostream.h>

#include <stdio.h>

#include <stdlib.h>

#include <io.h>

FILE *fl;

void fbr();

void fbsort();

void fbw();

 

int main()

{

fbr(); // Запись в файл

fbsort(); // Сортировка в файле

fbw(); // Чтение из файла

return 0;

}

 

void fbr()

{

 

if ((fl = fopen("lab2.dat","wb"))==NULL)

{

cout << "Oshibka pri sozdanii"<<endl;

exit(1);

}

int a;

do {

cin >> a;

int nwrt = fwrite(&a, sizeof(int), 1, fl);

} while (a!= -1);

 

fclose(fl);

}

 

 

void fbsort()

{

if ((fl = fopen("lab2.dat","rb+"))==NULL)

{

cout << "Oshibka pri otritii"<<endl;

exit(1);

}

int nb =sizeof(int), a, b, nwrt;

int n=filelength(fileno(fl))/nb;

 

for (int i=0; i<n-1; i++)

for (int j=i+1; j<n; j++)

{

fseek(fl,i*nb, SEEK_SET); nwrt = fread(&a, nb, 1, fl);

fseek(fl,j*nb, SEEK_SET); nwrt = fread(&b, nb, 1, fl);

if (a>b)

{

fseek(fl,i*nb, SEEK_SET); nwrt = fwrite(&b, nb, 1, fl);

fseek(fl,j*nb, SEEK_SET); nwrt = fwrite(&a, nb, 1, fl);

}

}

fclose(fl);

}

 

void fbw()

{

if ((fl = fopen("lab2.dat","rb"))==NULL)

{

cout << "Oshibka pri otritii"<<endl;

exit(1);

}

 

int a;

while(true)

{

int nwrt = fread(&a, sizeof(int), 1, fl);

if (nwrt!=1) break;

cout << a << " ";

}

fclose(fl);

}

<== предыдущая лекция | следующая лекция ==>
Функции для открытия-закрытия файла | Институциональная структура финансовой системы страны
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 567; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




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