Язык программирования С++ обеспечивает несколько способов работы с файлами. Рассмотрим способ потока. Поток является некоторым абстрактным понятием, который относится к любому переносу данных (последовательность байтов) от источника к приемнику. Операция записи информации в поток называется включением информации, а чтение информации из потока извлечением. Эти операции выполняются через буфер. Потоки бывают входные (информация заносится в память), выходные (информация считывается из памяти), а также двунаправленные (допускается как чтение информации, так и запись) [1-5].
Для работы с файловыми потоками применяются классы istream и ostream. Эти классы базовые для класса iostream, который реализует двунаправленный поток. Чтобы применить в программе этих классов нужно подключить соответствующие заголовочные файлы.
Преимущества работы с файлами используя поток по сравнению с функциями ввода-вывода — контроль типов и работа с типами пользователя. Недостаток работы с использованием потока — это уменьшение быстродействия программы.
Данные в файл могут быть переданы в двоичном или текстовом представлении. Отсюда потоки делятся на двоичные и текстовые. Последовательность символов — это текстовый поток, а последовательность байтов представляет двоичный поток.
Работа с файлами заключается в выполнении следующих операций:
- открытие файла (для записи информации, добавления или чтения);
- запись информации в файл или считывание её с файла;
- закрытие файла.
При закрытии файл отсоединяется от потока.
Чтобы связать поток с файлом, нужно использовать управляющую структуру (указатель файла), которая имеет тип FILE. Эта структура содержит всю информацию о файле.
Используя FILE, переменная типа указатель файла объявляется следующим образом:
FILE * myfile;
После этого нужно выполнить операции открытия потока и связывания его с именем файла на конкретном физическом носителе. Это делается с помощью функции fopen():
FILE *fopen (const char *file_name, const char *file_mode);
Здесь *file_name — это имя файла, перед именем можно указать путь к файлу. Параметр *file_mode определяет режим открытия файла.
Если при выполнении операции открытия файла вышла ошибка, то fopen() вернет NULL, т.е. пустой указатель.
Файл закрывается с помощью функции fclose():
int fclose(FILE *myfile);
Здесь myfile указатель файла.
Cимвола с файла можно считать используя функцию fgetc():
int fgetc(FILE *myfile);
fgetc() возвращает целочисленное значение. Символ находится в младшем разряде. В том случае, если чтение произошло без ошибок, то старший разряд равен нулю. При чтении признака конца файла функция fgetc() вернет значение EOF.
Символ в файл записывается с помощью функции fputc():
int fputc( int сh, FILE *myfile);
Здесь сh — записываемый символ. В файл записывается только младший разряд сh.
Для определения достигнут ли конец файла, необходимо использовать функцию feof():
int feof(FILE *myfile);
При чтении признака конца файла feof() вернет true, а иначе — false.
Задача
Составить программу, которая копирует все символы из одного файла в другой кроме цифр.
Решение
/* В начале подключаем четыре заголовочных файла: iostream.h (содержит cin и cout), stdio.h (содержит тип FILE и все функции для работы с файлами), stdlib.h (содержит exit()), conio.h (содержит getch()).*/
void main(){
FILE *inmyfile, *outmyfile;
char mych, FileRead[]="d:\\old.txt", FileWrite[]="d:\\new.txt";
inmyfile = fopen(FileRead,"rb");
outmyfile = fopen(FileWrite,"wb");
if (inmyfile==NULL)
{ cout
Данные из файла можно считывать и записывать строками. Для этого используются функции fgets() и fputs():
int fputs(const char *mys, FILE *myfilename);
char *fgets(char *mys, int n, FILE *myfilename);
Здесь параметр n — это длина строки, *mys — указатель на строку.
Задача
Составить программу, которая считывает с клавиатуры строки и записывает их в файл. Выход из программы при вводе пустой строки.
Решение
/* В начале подключаем четыре заголовочных файла: iostream.h, stdio.h, stdlib.h, conio.h.*/
void main(){
char mystr[256];
FILE * myfile= fopen("d:\\Testmy.txt","w");
if ( myfile==NULL)
{ cout
Задача
Составить программу, которая считывает информацию с файла и выводит на экран.
Решение
/* В начале подключаем четыре заголовочных файла: iostream.h, stdio.h, stdlib.h, conio.h.*/
int main(){
const int n=256;
char mystr[n];
FILE * myfile= fopen("d:\\Testmy.txt","r");
if ( myfile==NULL)
{ cout
Для чтения и записи данных любых типов используются функции: fread() и fwrite():
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);
Пример использования функций fread() и fwrite():
/* В начале подключаем заголовочныe файлы: iostream.h, stdio.h, stdlib.h, conio.h, string.h */
void main() {
struct spisok { char fam[40];
int d,m,y;
char ad[100];} sp;
int i,k;
FILE *myfile=fopen("d:\\spisok.dat","wb+");
cout >k;
for(i=0;i>sp.d;
cout>sp.m;
cout>sp.y;
cout
Язык программирования С++ обеспечивает несколько способов работы с файлами. Рассмотрим способ потока. Поток является некоторым абстрактным понятием, который относится к любому переносу данных (последовательность байтов) от источника к приемнику. Операция записи информации в поток называется включением информации, а чтение информации из потока извлечением. Эти операции выполняются через буфер. Потоки бывают входные (информация заносится в память), выходные (информация считывается из памяти), а также двунаправленные (допускается как чтение информации, так и запись) [1-5].
Для работы с файловыми потоками применяются классы istream и ostream. Эти классы базовые для класса iostream, который реализует двунаправленный поток. Чтобы применить в программе этих классов нужно подключить соответствующие заголовочные файлы.
Преимущества работы с файлами используя поток по сравнению с функциями ввода-вывода — контроль типов и работа с типами пользователя. Недостаток работы с использованием потока — это уменьшение быстродействия программы.
Данные в файл могут быть переданы в двоичном или текстовом представлении. Отсюда потоки делятся на двоичные и текстовые. Последовательность символов — это текстовый поток, а последовательность байтов представляет двоичный поток.
Работа с файлами заключается в выполнении следующих операций:
- открытие файла (для записи информации, добавления или чтения);
- запись информации в файл или считывание её с файла;
- закрытие файла.
При закрытии файл отсоединяется от потока.
Чтобы связать поток с файлом, нужно использовать управляющую структуру (указатель файла), которая имеет тип FILE. Эта структура содержит всю информацию о файле.
Используя FILE, переменная типа указатель файла объявляется следующим образом:
FILE * myfile;
После этого нужно выполнить операции открытия потока и связывания его с именем файла на конкретном физическом носителе. Это делается с помощью функции fopen():
FILE *fopen (const char *file_name, const char *file_mode);
Здесь *file_name — это имя файла, перед именем можно указать путь к файлу. Параметр *file_mode определяет режим открытия файла.
Если при выполнении операции открытия файла вышла ошибка, то fopen() вернет NULL, т.е. пустой указатель.
Файл закрывается с помощью функции fclose():
int fclose(FILE *myfile);
Здесь myfile указатель файла.
Cимвола с файла можно считать используя функцию fgetc():
int fgetc(FILE *myfile);
fgetc() возвращает целочисленное значение. Символ находится в младшем разряде. В том случае, если чтение произошло без ошибок, то старший разряд равен нулю. При чтении признака конца файла функция fgetc() вернет значение EOF.
Символ в файл записывается с помощью функции fputc():
int fputc( int сh, FILE *myfile);
Здесь сh — записываемый символ. В файл записывается только младший разряд сh.
Для определения достигнут ли конец файла, необходимо использовать функцию feof():
int feof(FILE *myfile);
При чтении признака конца файла feof() вернет true, а иначе — false.
Задача
Составить программу, которая копирует все символы из одного файла в другой кроме цифр.
Решение
/* В начале подключаем четыре заголовочных файла: iostream.h (содержит cin и cout), stdio.h (содержит тип FILE и все функции для работы с файлами), stdlib.h (содержит exit()), conio.h (содержит getch()).*/
void main(){
FILE *inmyfile, *outmyfile;
char mych, FileRead[]="d:\\old.txt", FileWrite[]="d:\\new.txt";
inmyfile = fopen(FileRead,"rb");
outmyfile = fopen(FileWrite,"wb");
if (inmyfile==NULL)
{ cout
Данные из файла можно считывать и записывать строками. Для этого используются функции fgets() и fputs():
int fputs(const char *mys, FILE *myfilename);
char *fgets(char *mys, int n, FILE *myfilename);
Здесь параметр n — это длина строки, *mys — указатель на строку.
Задача
Составить программу, которая считывает с клавиатуры строки и записывает их в файл. Выход из программы при вводе пустой строки.
Решение
/* В начале подключаем четыре заголовочных файла: iostream.h, stdio.h, stdlib.h, conio.h.*/
void main(){
char mystr[256];
FILE * myfile= fopen("d:\\Testmy.txt","w");
if ( myfile==NULL)
{ cout
Задача
Составить программу, которая считывает информацию с файла и выводит на экран.
Решение
/* В начале подключаем четыре заголовочных файла: iostream.h, stdio.h, stdlib.h, conio.h.*/
int main(){
const int n=256;
char mystr[n];
FILE * myfile= fopen("d:\\Testmy.txt","r");
if ( myfile==NULL)
{ cout
Для чтения и записи данных любых типов используются функции: fread() и fwrite():
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);
Пример использования функций fread() и fwrite():
/* В начале подключаем заголовочныe файлы: iostream.h, stdio.h, stdlib.h, conio.h, string.h */
void main() {
struct spisok { char fam[40];
int d,m,y;
char ad[100];} sp;
int i,k;
FILE *myfile=fopen("d:\\spisok.dat","wb+");
cout >k;
for(i=0;i>sp.d;
cout>sp.m;
cout>sp.y;
coutДля чтения и записи данных при прямом доступе используется функция fseek(), которая устанавливает указатель файла в нужную позицию:int fseek(FILE *file_stream, long offset, int whence);
Здесь offset — количество байтов, на которое нужно перенести указатель файла, начиная от позиции whence. Параметр whence может принимать значения SEEK_SET (начало файла), SEEK_CUR (текущая позиция файла), SEEK_END (конец файла).
Функцию fseek() можно использовать для того, чтобы перейти к нужному элементу файла внутри однотипных данных. Например, чтобы получить доступ к пятому элементу в файле, нужно использовать:
fseek(myfile, 4*sizeof (spisok), SEEK_SET);
Здесь spisok — тип элементов.
Для определения значения указателя текущей позиции в файле нужно использовать функцию ftell():
long int ftell(FILE *file_stream);
Вывод
В работе рассмотрены способы работы с файлами на языке программирования С++. В качестве примера приведены решения некоторых задач. Приведенные программы могут быть использованы при решении задач по файлам.