comp-science.narod.ru ==> Дидактические материалы по информатике ==> Файлы в C++


 

Файлы в C++

Файлом называют способ хранения информации на физическом устройстве. Файл — это понятие, которое применимо ко всему — от файла на диске до терминала.

В C++ отсутствуют операторы для работы с файлами. Все необходимые действия выполняются с помощью функций, включенных в стандартную библиотеку. Они позволяют работать с различными устройствами, такими, как диски, принтер, коммуникационные каналы и т.д. Эти устройства сильно отличаются друг от друга. Однако файловая система преобразует их в единое абстрактное логическое устройство, называемое потоком.

Текстовый поток — это последовательность символов. При передаче символов из потока на экран, часть из них не выводится (например, символ возврата каретки, перевода строки).

Двоичный поток — это последовательность байтов, которые однозначно соответствуют тому, что находится на внешнем устройстве.

Организация работы с файлами средствами C

Объявление файла

	FILE *идентификатор;
Пример
	FILE *f;
Открытие файла:
	fopen(имя физического файла, режим доступа)

Режим доступа — строка, указывающая режим открытия файла файла и тип файла

Типы файла: бинарный (b); текстовый (t)
ЗначениеОписание
rФайл открывается только для чтения
wФайл открывается только для записи. Если соответствующий физический файл существует, он будет перезаписан
aФайл открывается для записи в конец (для дозаписи) или создается, если не существует
r+Файл открывается для чтения и записи.
w+Файл открывается для записи и чтения. Если соответствующий физический файл существует, он будет перезаписан
a+Файл открывается для записи в конец (для дозаписи) или создается, если не существует
Например

f = fopen(s, "wb");
k = fopen("h:\ex.dat", "rb");

Неформатированные файловый ввод-вывод

Запись в файл

	fwrite(адрес записываемой величины, размер одного экземпляра, количество записываемых величин, имя логического файла);
Например,
	fwrite(&dat, sizeof(int), 1, f);

Чтение из файла

	fread(адрес величины, размер одного экземпляра, количество считываемых величин, имя логического файла);
Например,
	fread(&dat, sizeof(int), 1, f);

Закрытие файла

	fclose(имя логического файла);

Пример 1. Заполнить файл некоторым количеством целых случайных чисел.

/* Заполнить файл некоторым количеством целых случайных чисел. */

/* Dev-C++ */
#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
 FILE *f; int dat;
 srand(time(0));
 int n=rand()%30 + 1;
 cout << "File name? ";
 char s[20];
 cin.getline(s, 20);
 f=fopen(s, "wb");
 for (int i=1; i<=n; i++)
 { dat = rand()%101 - 50;
   cout << dat << " ";
   fwrite(&dat, sizeof(int), 1, f);
 }
 cout << endl;
 fclose(f);
    system("PAUSE");
    return EXIT_SUCCESS;
}

Пример 2. Найти сумму и количество целых чисел, записанных в бинарный файл.

/* Найти сумму и количество целых чисел, записанных в бинарный файл. */
/* Dev-C++ */
#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
 FILE *f;
 int dat, n=0, sum=0;
 
 cout << "File name? ";
 char s[20];
 cin.getline(s, 20);
 f=fopen(s, "rb");
 while (fread(&dat, sizeof(int), 1, f))
       {n++;
        cout << dat << " ";
        sum+=dat;
       }
 cout << endl;
 cout << "sum: " << sum << "; number: " << n << endl;
 fclose(f);
 system("PAUSE");
 return EXIT_SUCCESS;
}

Пример 3. Поместить в файл n записей, содержащих сведения о кроликах, содержащихся в хозяйстве: пол (m/f), возраст (в мес.), масса.

/* Поместить в файл n записей, содержащих сведения о кроликах, содержащихся в хозяйстве:
   пол (m/f), возраст (в мес.), масса. */

/* Dev-C++ */
#include <cstdlib>
#include <iostream>

using namespace std;

struct krolik {char pol; int vozrast; double massa;};

int main()
{
 FILE *f; krolik dat; int n;
 cout << "File name? ";
 char s[20];
 cin.getline(s, 20);
 f=fopen(s, "wb");
 cout << "How many rabbits? "; cin >> n;
 for (int i=1; i<=n; i++)
 { cout << "What sex " << i << "th rabbit? "; cin >> dat.pol;
   cout << "How old " << i << "th rabbit? "; cin >> dat.vozrast;
   cout << "What is the mass of the " << i << "th rabbit? "; cin >> dat.massa;
   fwrite(&dat, sizeof(krolik), 1, f);
 }
 fclose(f);
    system("PAUSE");
    return EXIT_SUCCESS;
}

Пример 3 (продолжение). В бинарном файле хранятся сведения о кроликах, содержащихся в хозяйстве: пол (m/f), возраст (в мес.), масса. Найти наиболее старого кролика. Если таких несколько, то вывести информацию о том из них, масса которого больше.

/* В бинарном файле хранятся сведения о  кроликах, содержащихся в хозяйстве: пол (m/f),   возраст (в мес.), масса.
   Найти наиболее старого кролика. Если таких несколько, то вывести информацию о том из них, масса которого больше. */

/* Dev-C++ */
#include <cstdlib>
#include <iostream>

using namespace std;

struct krolik {char pol; int vozrast; double massa;};

int main()
{
 FILE *f; krolik dat, max; int n;
 cout << "File name? ";
 char s[20];
 cin.getline(s, 20);
 f=fopen(s, "rb");
 fread(&dat, sizeof(krolik), 1, f);
 max=dat;
 while (fread(&dat, sizeof(krolik), 1, f))
 {if (dat.vozrast>max.vozrast) max=dat;
  else if (dat.vozrast==max.vozrast&&dat.massa>max.massa) max=dat;}
 cout << "The oldest rabbit has a sex " << max.pol << ", age " << max.vozrast << " and mass " << max.massa << endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}

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

1) Функции fgetc() и fputc() позволяют соттветственно осуществить ввод-вывод символа.

2) Функции fgets() и fputs() позволяют соттветственно осуществить ввод-вывод строки.

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

Организация работы с файлами средствами C++

Файловый ввод-вывод с использованием потоков

Библиотека потокового ввода-вывода

	fstream

Связь файла с потоком вывода

 ofstream имя логического файла;

Связь файла с потоком ввода

ifstream имя логического файла;

Открытие файла

имя логического файла.open(имя физического файла);

Закрытие файла

имя логического файла.close();

Пример 4. Заполнить файл значениями функции y = x * cos x.

/* Заполнить файл значениями функции y = x * cos x. */

/* Dev-C++ */
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

double fun(double x);

int main()
{double a, b, h, x; char s[20];
 cout << "Enter the beginning and end of the segment, step-tabulation: ";
 cin >> a >> b >> h;
 cout << "File name? "; cin >> s;
 ofstream f;
 f.open(s);
 for (x=a; x<=b; x+=h)
  {f.width(10);   f << x;
   f.width(15);   f << fun(x) << endl;  }
 f.close();

    system("PAUSE");
    return EXIT_SUCCESS;
}
double fun(double x)
{ return x*cos(x); }

Пример 5. Файл содержит несколько строк, в каждой из которых записано единственное выражение вида a#b (без ошибок), где a, b - целочисленные величины, # - операция +, -, /, *. Вывести каждое из выражений и их значения.

/* Dev-C++ */
#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;
int main()
{
long a, b;  char s[256], c;  int i;
  cout << "File name? "; cin >> s;
  ifstream f;  f.open(s);
  while (!f.eof())
   {    f.getline(s, 256);
    i=0; a=0;
    while (s[i]>='0'&&s[i]<='9')
     {
          a=a*10+s[i]-'0';
           i++;
     }
    c=s[i++];    b=0;
    while (s[i]>='0'&&s[i]<='9')
     {
          b=b*10+s[i]-'0';
           i++;
     }
    switch (c){
    case '+': a+=b; break;
    case '-': a-=b; break;
    case '/': a/=b; break;
    case '*': a*=b; break;}
    cout << s << " = " << a << endl;   }
    f.close();
    system("PAUSE");
    return EXIT_SUCCESS;
}

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

/* В заданном файле целых чисел посчитать количество компонент, кратных 3. */
/* Dev-C++ */
#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;
int main()
{int r,ch;
  ifstream f;
  f.open("CH_Z.TXT");
  ch=0;
  for (;f.peek()!=EOF;)
    {f>>r;
     cout << r << " ";
     if (r%3==0) ch++ ;
     }
  f.close();
  cout << endl << "Answer: " << ch;
    system("PAUSE");
    return EXIT_SUCCESS;
}

 


[Заглавная страница] [Олимпиады по программированию] [Подготовка к олимпиадам] [Дидактические материалы по информатике]
[Дидактические материалы по математике] [Методическая копилка] [Ресурсы Интернет] [Об авторе]

 


Рейтинг ресурсов УралWeb

 

© Шестаков А.П., 2011
Сайт создан в системе uCoz