Слайд 4
Тип доступа
вызов функции создания (открытия) файла
изменение переменной
_fmode (stdio.h)
O_TEXT
O_BINARY
Слайд 5
Библиотечные
функции
Префиксные
Поточные
Открытые файлы операционной системы
Префикс
Файл
0
stdin
1
stdout
2
stderr
3
stdaux
4
stdprn
Слайд 7
Механизм записи в файл
Открыть файл для записи
123
87
Текстовый файл
Слайд 9
Функции для поточного доступа к файлам
Функции
поточного ввода-вывода называют стандартными функциями ввода-вывода.
Си создает
внутреннюю структурную переменную по шаблону FILE (stdio.h).
Слайд 10
FILE* fopen (const char *filename, const char* mode)
возвращает
указатель на
переменную типа FILE
константная строка - имя файла
режим
открытия файла
В случае неуспеха функция возвращает значение NULL
Режимы открытия файла
r - открыть для чтения.
w - создать для записи.
Слайд 11
a – открыть файл для обновления, открывает файл
для записи в конец файла или создает файл для
записи, если файла не существует.
r+ - открыть существующий файл для корректировки (чтения и записи).
w+ - создать новый файл для корректировки (чтения и записи).
a+ - открыть для обновления; открывает для корректировки (чтения и записи) в конец файла, или создает, если файла не существует.
t – открыть файл в текстовом режиме.
Слайд 12
b – открыть файл в двоичном режиме.
По умолчанию
установлен текстовый режим доступа к файлу.
Режимы t и
b указываются вторыми символами в строковой переменной mode, например “r+b”.
Слайд 13
Проверка корректности открытия файла:
int main(int argc, char *argv[])
{
system("chcp 1251");
FILE *f;
char name [] = "prim.txt";
if ((f = fopen(name,"rb"))==NULL) {
printf( "File not found ");
system("PAUSE"); }
else printf( "Ok... ");
system("PAUSE");
return EXIT_SUCCESS;}
Слайд 14
int fclose(FILE *fp) - закрывает файл fp, при
успешной работе возвращает 0, при неуспешной EOF).
int closeall(void) –
закрывает все файлы, открытые в программе, при успешной работе возвращает число закрытых потоков, при неуспешной - EOF.
FILE *freopen(const char *filename, const char* mode, FILE *stream) – закрывает поток stream, открывает поток filename с новыми правами доступа установленными в mode. Если потоки разные, то происходит переадресация потока stream в поток filename.
Слайд 15
…char name[] = "prim.txt";
int
n;
FILE *f;
printf( “Введите целое число
n: ");
scanf("%d", &n);
freopen(name,"wt",stdout);
for (int i=0;i printf("%d\n",i);
fclose(f);
system("PAUSE");
return EXIT_SUCCESS; …
Слайд 16
ch = fgetc( ) – возвращает
символ ch из файла, с которым связан указатель.
ch =
getc( <указатель на файл>) – возвращает символ ch из файла, с которым связан указатель.
fputc(ch,<указатель на файл>) – записать символ ch в указанный файл.
putc(ch,<указатель на файл>) – записать символ ch в файл.
fgets(str, n, <указатель на файл>) – прочитать строку str, длиной n символов, или до первого встреченного \n из указанного файла.
Слайд 17
fputs(str, ) – записать строку str,
в файл. Символ перевода на другую строку в файл
не записывается.
fscanf( <указатель на файл>, управляющая строка, ссылка) – универсальная функция считывания из текстового файла.
fscanf(f,”%d”,&n)
fread(ptr,size,n,<указатель на файл>) – считывает n элементов размером size в область памяти, начиная с ptr. В случае успеха возвращает количество считанных элементов, в случае неуспеха – EOF.
Слайд 18
fwrite(ptr,size,n,) – записывает n элементов размером
size из памяти, начиная с ptr в файл– в
случае успеха возвращает количество записанных элементов, в случае неуспеха – EOF.
fprintf( <указатель на файл>, управляющая строка, [список аргументов] ) – форматированный вывод в файл.
функции прямого доступа к файлу
rewind( <указатель файла>) – установить указатель файла на начало файла.
Слайд 19
int fseek( , offset, fromwheare) - установить
указатель чтения-записи файла на позицию offset, относительно позиции fromwheare.
значения fromwheare
SEEK_END – от конца файла,
SEEK_SET – от начала файла,
SEEK_CUR – от текущей позиции.
Слайд 20
long int n = ftell (
файл>) – в переменную n передать номер текущей позиции
в файле.
int z = fgetpos ( <указатель файла>, npos) - в динамической памяти по адресу npos записать номер текущей позиции в файле, в случае успеха функция возвращает 0; в противном случае – любое ненулевое число.
int unlink ( <имя файла>) – удаление файла, при успехе функция возвращает 0, при неуспехе - -1.
int rename( <старое имя>,<новое имя>) – переименованиие файла, при успехе функция возвращает 0, при неуспехе - -1.
int feof ( <указатель на файл>) возвращает 0, если конец файла не достигнут, любое ненулевое число, если достигнут.
Слайд 21
int ferror( ) возвращает ненулевое значение,
если при работе с файлом возникла ошибка, 0 –
в противном случае.
Слайд 22
Примеры работы с файлами
Запись данных в текстовый файл
Пример 1. Создать вещественный массив случайным образом и сохранить
его в текстовом файле.
#include
int main(int argc, char *argv[])
{ int n;
FILE *f;
int flag = 1;
char name[25];
Слайд 23
system("chcp 1251");
// Создадим цикл, позволяющий корректировать ввод
// имени
файла
do
{
printf( "Введите имя создаваемого файла: ");
scanf("%s",name);
// Попытка открыть файл для чтения. Если такой файл // уже существует, то задать вопрос пользователю
if ((f = fopen(name,"r"))!=NULL)
{
// Заменить существующий файл?
Слайд 24
printf("Файл уже существует. Заменить? (y/n)");
char ch = getch();
//
Если пользователь нажал кнопку «n», очистить
// экран, вернуться
к началу цикла
if (ch == 'n') { system("cls"); continue; }
}
// В этот блок программы управление попадет только
// если пользователь подтвердил замену или задал имя
// несуществующего файла.
// Создать файл.
if ((f=fopen(name,"w"))==NULL)
{
printf("Ошибка создания файла");
system("PAUSE");
Слайд 25
break;
}
printf("\nВведите размерность массива: ");
scanf("%d",&n);
for(int i=0;i
y = rand() %100/(rand()%50+1.)-rand()%30;
// На одной строке файла печатать
только 10
// элементов.
if (i>=10&&i%10==0) fprintf(f,"\n");
fprintf(f,"%8.3f",y);
}
// Закрыть файл.
fclose(f);
Слайд 26
// Закончить цикл
flag = 0;
} while
(flag);
printf(“Файл создан. ");
system("PAUSE");
return EXIT_SUCCESS;
}
Слайд 28
Чтение данных из текстового файла
Слайд 29
Пример 2. На первой строке в файле записана
размерность целочисленной матрицы. Далее – сама матрица. Считать матрицу
в память и вывести ее на экран. Данные записаны в файле data.txt.
int main(int argc, char *argv[])
{
system("chcp 1251");
FILE *f;
Слайд 30
f = fopen(“data.txt", "r");
// Проверка ошибки открытия файла
if
(f==NULL) {
printf("Файл не найден... /n Для окончания работы нажмите
любую клавишу...");
system("pause");
exit(0);
}
int n,m;
// Чтение размерности матрицы
fscanf(f,"%d",&n);
fscanf(f,"%d",&m);
int **a;
// Выделение памяти под матрицу
Слайд 31
a = new int* [n];
for(int i=0;i
new int [m];
// Чтение матрицы
for(int i=0;i
fscanf(f,"%d",&a[i][j]);
printf("Прочитана матрица: \n");
// Печать элементов матрицы
for( int i=0;i for(int j=0;j printf("%5d",a[i][j]);
printf("\n"); }
system("pause");
}
Слайд 32
Пример 3. В текстовом файле записано произвольное количество
чисел. Считать данные из файла в массив и вывести
на экран.
int main(int argc, char *argv[])
{
system("chcp 1251");
FILE *f;
Слайд 33
f = fopen("my.txt", "r");
// Проверка ошибки открытия файла
if
(f==NULL) {
printf("Файл не найден... /n Для окончания работы нажмите
любую клавишу...");
system("PAUSE");
exit(0);
}
int n=0,y;
int *a;
// пока не конец файла f
while (!feof(f))
{
Слайд 34
// читать элемент и
int z =
fscanf(f,"%d",&y);
if (!z) continue;
// увеличивать счетчик.
n++;
}
// После окончания цикла
в переменной n хранится
// количество целых чисел, записанных в файле.
// Выделить память под массив.
a = new int [n];
// Указатель чтения-записи файла передвинуть в
// начало.
fseek(f,0,SEEK_SET);
// Читать n целых чисел из файла в массив.
for(int i=0;i
Слайд 35
fscanf(f,"%d",&a[i]);
printf("Прочитан массив: \n");
for(int i=0;i
Слайд 36
Изменение текстового файла
Пример 4. В текстовом файле расположен
произвольный текст. Не считывая весь текст в память изменить
все первые буквы слов на прописные.
int main(int argc, char *argv[])
{
// Откроем файл для чтения с дополнением.
// Символ окончания файла в этом случае
// автоматически удаляется.
FILE *f = fopen("text.txt","r+");
Слайд 37
FILE *f1 = fopen("text.txt","r+");
if (f==NULL) {
printf("Файл не найден.
\n");
system("PAUSE");
return EXIT_SUCCESS;
}
char word[100];
long pos1;
// Организуем бесконечный цикл для чтения
файла.
Слайд 38
while (1) {
// Если чтение прошло неуспешно, значит
достигнут конец
// файла,
// в этом случае нужно закончить
выполнение цикла
if ( fscanf(f,"%s",word)!=1) break;
// В переменную pos1 получить текущую
// позицию указателя чтения-записи.
pos1 = ftell(f);
// Установить указатель на позицию, с которой было
// считано слово.
Слайд 39
fseek(f1,pos1-strlen(word),SEEK_SET);
word[0] = toupper(word[0]);
printf(" %s\n",word);
// Записать в
файл измененное слово.
fprintf(f1,"%s",word);
}
fclose(f1);
// Вывод измененного файла на экран
fseek(f,0,SEEK_SET);
while
(1) {