Опубликован: 02.02.2011 | Уровень: для всех | Доступ: свободно
Лекция 20:

Стандартные файлы и функции по работе с ними

< Лекция 19 || Лекция 20: 1234 || Лекция 21 >

Функция закрытия файла

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

Синтаксис:

int fclose(УказательНаПоток);

Возвращает 0 при успешном закрытии файла и -1 в противном случае.

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

Функция удаления файла

Синтаксис:

int remove(const char *filename);

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

Функция переименования файла

Синтаксис:

int rename(const char *oldfilename, const char *newfilename);

Функция переименовывает файл; первый параметр – старое имя файла, второй – новое. Возвращает 0 при неудачном выполнении.

Функция контроля конца файла

Для контроля достижения конца файла есть функция feof.

int feof(FILE * filename);

Функция возвращает ненулевое значение, если достигнут конец файла.

Функции ввода-вывода данных файла

1) Символьный ввод-вывод

Для символьного ввода-вывода используются функции:

int fgetc(FILE *fp);

где fpуказатель на поток, из которого выполняется считывание.

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

int fputc(int c, FILE*fp);

где fpуказатель на поток, в который выполняется запись;

cпеременная типа int, в которой содержится записываемый в поток символ.

Функция возвращает записанный в поток fp символ в формате int. Если символ не может быть записан, то возвращается значение EOF.

Пример 2.

#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
  FILE *f; 
  int c;
  char *filename="t.txt";
  if ((f=fopen(filename,"r"))==0)
    perror(filename);
  else 
    while((c = fgetc(f)) != EOF)
      putchar(c);
      //вывод с на стандартное устройство вывода
  fclose(f);
  system("pause");
  return 0;
}

2) Строковый ввод-вывод

Для построчного ввода-вывода используются следующие функции:

char *fgets(char *s, int n, FILE *f);

где char *sадрес, по которому размещаются считанные байты;

int n – количество считанных байтов;

FILE *fуказатель на файл, из которого производится считывание.

Прием байтов заканчивается после передачи n-1 байтов или при получении управляющего символа '\n'. Управляющий символ тоже передается в принимающую строку. Строка в любом случае заканчивается '\0'. При успешном завершении считывания функция возвращает указатель на прочитанную строку, при неуспешном – 0.

int fputs(char *s, FILE *f);

где char *sадрес, из которого берутся записываемые в файл байты;

FILE *fуказатель на файл, в который производится запись.

Символ конца строки ( '\0' ) в файл не записывается. Функция возвращает EOF, если при записи в файл произошла ошибка, при успешной записи возвращает неотрицательное число.

Пример 3. Построчное копирование данных из файла f1.txt в файл f2.txt.

#include "stdafx.h"
#include <iostream>
using namespace std;
#define MAXLINE 255 //максимальная длина строки
int _tmain(int argc, _TCHAR* argv[]){
//копирование файла in в файл out
  FILE *in, //исходный файл
       *out; //принимающий файл
  char buf[MAXLINE]; 
  //строка, с помощью которой выполняется копирование
  in=fopen("f1.txt","r");
  //открыть исходный файл для чтения 
  out=fopen("f2.txt","w");
  //открыть принимающий файл для записи
  while(fgets(buf, MAXLINE, in)!=0) 
  //прочитать байты из файла in в строку buf
    fputs(buf, out);
    //записать байты из строки buf в файл out
  fclose(in); //закрыть исходный файл
  fclose(out);//закрыть принимающий файл
  system("pause");
  return 0;
}

3) Блоковый ввод-вывод

Для блокового ввода-вывода используются функции:

int fread(void *ptr, int size, int n, FILE *f);

где void *ptrуказатель на область памяти, в которой размещаются считанные из файла данные;

int size – размер одного считываемого элемента;

int n – количество считываемых элементов;

FILE *fуказатель на файл, из которого производится считывание.

В случае успешного считывания функция возвращает количество считанных элементов, иначе – EOF.

int fwrite(void *ptr ,int size, int n, FILE *f);

где void *ptrуказатель на область памяти, в которой размещаются считанные из файла данные;

int size – размер одного записываемого элемента;

int n – количество записываемых элементов;

FILE *fуказатель на файл, в который производится запись.

В случае успешной записи функция возвращает количество записанных элементов, иначе – EOF.

Пример 4.

#include "stdafx.h"
#include <iostream>
using namespace std;
struct Employee {char name[30];
                 char title[30];
                 float rate;
                };
int _tmain(int argc, _TCHAR* argv[]){
  Employee e;
  FILE *f;
  if((f=fopen("text.dat","w"))==NULL) {
    printf("\nФайл не открыт для записи");
  }
  int n;
  //запись в файл
  printf("\nВведите количество записей N=");
  scanf("%d",&n);
  for(int i=0;i<n;i++) {
    //формируем структуру е 
    printf("имя:");scanf("%s",&e.name);
    printf("наименование:");scanf("%s",&e.title);
    printf("налог:");scanf("%f",&e.rate);
    //записываем е в файл
    fwrite(&e,sizeof(Employee),1,f);
  }
  fclose(f);
  //чтение из файла
  if((f=fopen("text.dat","rb"))==NULL) 
    printf("\nФайл не открыт для чтения");
  while(fread(&e,sizeof(Employee),1,f)) 
    printf("%s, %s, %f;\n", e.name, e.title, e.rate);
  fclose(f);
  system("pause");
  return 0;
}

4) Форматированный ввод-вывод

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

int fprintf(FILE *f, const char *fmt, ...);

где FILE*fуказатель на файл, в который производится запись;

const char *fmt – форматная строка;

par1, par2, ... – список переменных, в которые заносится информация из файла.

Функция возвращает число переменных, которым присвоено значение.

Пример 5.

#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[]){
  FILE *f;
  int n, nn,m;
  if((f=fopen("int.dat","w"))==0)
    perror("int.dat");
  for(n=1;n<11;n++)
    fprintf(f, "\n%d %d", n, n*n);
  fclose(f);
  if ((f=fopen("int.dat","r"))==0)
    perror("int.dat");
  m=1;
  while(fscanf(f, "%d %d",&n, &nn)&& m++<11) 
    printf("\n%d %d",n,nn);
  fclose(f);
  system("pause");
  return 0;
}
< Лекция 19 || Лекция 20: 1234 || Лекция 21 >
Денис Курбатов
Денис Курбатов
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Андрей Садовщиков
Андрей Садовщиков
Россия