Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие_С++.docx
Скачиваний:
88
Добавлен:
11.04.2015
Размер:
842.63 Кб
Скачать

Работа с текстовыми файлами

Файлы бывают текстовые (в которых можно записывать только буквы, цифры, скобки и т.п.) и двоичные (в которых могут храниться любые символы из таблицы). В текстовых файлах не употребляются первые 31 символ кодовой таблицы ASCII (управляющие), а символы конца строки 0x13 (возврат каретки, CR) и 0x10 (перевод строки LF) преобразуются при вводе в одиночный символ перевода строки \n (при выводе выполняется обратное преобразование). Эти символы добавляются в конце каждой строки, записываемой в текстовый файл. При обнаружении в текстовом файле символа с кодом 26 (0x26), т.е. признака конца файла, чтение файла в текстовом режиме заканчивается, хотя файл может иметь продолжение.

Создать текстовый файл можно с помощью текстового редактора и с помощью программы. Рассмотрим пример создания текстового файла. Следующая программа записывает в файл строку из 65 символов, а затем переписывает в другой файл только английские буквы.

#include "stdafx.h"

#include <string.h>

int main()

{ FILE *f, *r; // Указатели на файлы

char ch, pr[65];

char text[]="1,2,3,4,5 i caught a fish alive, 6,7,8,9,10 i let it go again!";

f=fopen("FIL1.txt","w"); // Создание нового файла FIL1.txt

fputs(text,f); // Запись в файл строки text

fclose(f); // Закрытие файла FIL1.txt

f=fopen("FIL1.txt","r");// Открытие файла FIL1.txt для чтения

r=fopen("FIL2.txt","w"); // Создание нового файла FIL2.txt

while (!feof(f)) // Пока не конец файла FIL1.txt

{ ch=fgetc(f); // Чтение символа в ch из файла FIL1.txt

if (ch >='a'&&ch<='z') // Прочитанный символ - буква?

fputc(ch,r); // Запись в файл FIL2.txt символа из ch

}

fclose(r); // Закрытие файла FIL2.txt

rewind(f); // Возврат указателя на начало файла FIL1.txt

fgets(pr,65,f); // Чтение из файла FIL2.txt строки в переменную pr

printf("%s\n",pr); // Вывод строки pr на дисплей

r=fopen("FIL2.txt","r"); // Открытие файла FIL2.txt для чтения

while (!feof(r)) // Пока не конец файла FIL2.txt

{ ch=fgetc(r); // Чтение символа из файла FIL2.txt

putchar(ch); // Вывод символа ch на дисплей

}

printf("\n");

fclose(f); // Закрытие файлов

fclose(r);

return 0;

}

Обработка бинарных файлов

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

Составим программу создания нового файла, каждая запись которого представляет собой структуру с информацией о городе: код, название, численность жителей.

#include "stdafx.h"

#include <conio.h>

typedef struct town

{ int kod;

char name[10];

long c; } city;// описание структуры записи о городе

city t; // опиание переменной такой структуры

int main()

{ char c;

FILE *f;

char ch;

f=fopen("file1.dat","wb");//открытие бинарного файла для записи

printf("\n Ввод информации о городе ");

do

{

printf("\nКод: "); scanf("%d", &t.kod);

printf("\nназвание: "); scanf("%s", t.name);

printf("\nколичество жителей: "); scanf("%ld", &t.c);

fwrite(&t, sizeof(t), 1, f);//запись в файл информации о городе

printf("\n END Закончить? y/n ");

ch=getch();

}

while (ch != 'y');

fclose(f);

}

Выполнение этой программы приведет к созданию бинарного файла с информацией о городах.

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

#include "stdafx.h"

#include <conio.h>

typedef struct town

{ int kod;

char name[10];

long c; } city;

city t;

int main()

{

FILE *f;

f=fopen("file1.dat","rb"); //открытие бинарного файла для чтения

fread(&t, sizeof(t), 1, f); //чтение из файла одной записи в t

while (!feof(f))

{

if(t.c>1000000)

printf("\n%3d название:%10s количество жителей:%ld",

t.kod, t.name, t.c);

fread(&t, sizeof(t), 1, f);

}

fclose(f);

}

2.15.2. Работа с потоками в С++

Поток — это понятие, относящееся к любому переносу данных от источника к приемнику. Потоки C++ обеспечивают надежную работу как со стандартными, так и с определенными пользователем типами данных.

Для работы с файлами в С++ необходимо подключить заголовочный файл <fstream>В <fstream> определены несколько классов и подключены заголовочные файлы <ifstream>файловый ввод и  <ofstream>  - файловый вывод.

Файловый потоковый ввод/вывод аналогичен стандартному вводу/выводу. Единственное отличие состоит в том, что ввод/вывод выполнятся не на экран, а в файл. Если ввод/вывод на стандартные устройства выполняется с помощью объектов  cin и cout, то для организации файлового потокового ввода/вывода достаточно создать собственные объекты, которые можно использовать аналогично операторам cin и cout.

Например, необходимо создать текстовый файл и записать в него строку «Работа с файлами в С++» средствами работы с потоками. Для этого необходимо проделать следующие шаги:

  1. создать объект класса ofstream;

  2. cвязать объект класса с файлом, в который будет производиться запись;

  3. записать строку в файл;

  4. закрыть файл.

#include "stdafx.h"

#include <iostream>

#include <fstream>

using namespace std;

  int main(int argc, char* argv[])

{ setlocale(0,"RUS");

  ofstream fout("cppstudio.txt"); /* создаём объект класса ofstream для записи и связываем его с файлом cppstudio.txt */

  fout<< "Работа с файлами в С++";// запись строки в файл

    fout.close(); // закрываем файл

    cout<<"Файл создан"<<"\n";

    return 0;

}

Для более углубленного изучения данного подхода работы с файлами рекомендуем обратиться, например, [2],[4].