4872

Файловые потоки. Чтение и запись текстовых файлов

Лекция

Информатика, кибернетика и программирование

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

Русский

2012-11-28

54.5 KB

8 чел.

Файловые потоки. Чтение и запись текстовых файлов.

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

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

Для осуществления операций с файлами предусмотрено три особых типа данных (класса): ifstreamofstream и fstream. Для их использования необходимо подключить одноименные заголовочные файлы. Эти типы данных работают с понятием «поток данных» (поток - англ. stream). Поток представляет собой абстракцию непрерывной последовательности данных. Открытие файла для чтения или записи связывает его с соответствующим потоком, запись в файл интерпретируется как передача данных в поток, а чтение – как извлечение данных из потока. ifstream соответствует файловому потоку для чтения (от input file stream), ofstream – для записи (output file stream), fstream – универсальный поток для чтения и записи.

Использование потоковых классов во многом схоже с вводом-выводом данных в консоль (также называемую стандартным потоком ввода-вывода) с помощью предопределенных потоковых объектов cin и cout. В частности, для файловых потоков определены аналогичные операторы форматируемого ввода-вывода >> и <<. Отличие же заключается в том, что файловый поток должен быть связан с файлом прежде, чем его можно будет использовать. Кроме того, файловый поток можно позиционировать в произвольную позицию в файле, в то время как для предопределенных потоков это обычно не имеет смысла.

Для создания файлового потока эти типы данных предусматривают следующие варианты:

  •  создать поток, не связывая его с файлом:

ifstream();

ofstream();

fstream();

  •  создать поток, открыть файл и связать поток с файлом:

ifstream( const char *name, ios::openmode mode = ios::in );

ofstream( const char* name, ios::openmode mode = ios::out | ios::trunk );

fstream( const char * name, ios::openmode mode = ios::in | ios::out );

Чтобы открыть файл для ввода или вывода, можно либо использовать второй вариант создания cоответствующего потока:

fstream fs( "filename.dat" );

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

void ifstream::open( const char *name, ios::openmode mode = ios::in );

    void ofstream::open( const char * name, ios::openmode mode = ios::out | ios::trunk );

    void fstream::open( const char * name, ios::openmode mode = ios::in | ios::out );

Здесь name – имя файла, mode – режим открытия файла. Параметр mode может принимать значения, указанные в таблице:

Режим открытия

Назначение

ios::in

Открыть файл для чтения

ios::out

Открыть файл для записи

ios::ate

Начало вывода устанавливается в конец файла

ios::app

Открыть файл для добавления в конец

ios::trunc

Усечь файл, то есть удалить его содержимое

ios::binary

Двоичный режим операций

Режимы открытия файла представляют собой битовые маски, поэтому можно задавать два или более режима, объединяя их побитовой операцией ИЛИ. В следующем фрагменте кода файл открывается для вывода с помощью функции open():

    ofstream fs;

    ofs.open("filename.dat");

Обратим внимание, что по умолчанию режим открытия файла соответствует типу файлового потока. У потока ввода или вывода флаг режима всегда установлен неявно. Например, для потока вывода в режиме добавления файла можно вместо оператора

ofstream ofs( "fname.txt", ios::out | ios::app );

написать 
    

  ofstream ofs( "fname.txt", ios::app );

Между режимами открытия файла ios::ate и ios::app имеется небольшая разница.

Если файл открывается в режиме добавления, весь вывод в файл будет осуществляться в позицию, начинающуюся с текущего конца файла, безотносительно к операциям позиционирования в файле. В режиме открытия ios::ate (от английского "at end") можно изменить позицию вывода в файл и осуществлять запись, начиная с нее. Для потоков вывода режим открытия эквивалентен ios::out | ios::trunc, то есть можно опустить режим усечения файла. Однако для потоков ввода-вывода его нужно указывать явно. Файлы, которые открываются для вывода, создаются, если они еще не существуют.

Если открытие файла завершилось неудачей, объект, соответствующий потоку, будет возвращать 0:

if ( ! ofs )

{

cout << "Файл не открыт\n";

 }

Проверить успешность открытия файла можно также с помощью функции-члена is_open(), имеющей следующий прототип:

int is_open() const;

Функция возвращает 1, если поток удалось связать с открытым файлом. Например,

if ( ! ofs.is_open() )

{

cout << "Файл не открыт\n";

return;

}

Если при открытии файла не указан режим ios::binary, файл открывается в текстовом режиме и после того, как файл успешно открыт, для выполнения операций ввода-вывода можно использовать операторы извлечения и вставки в поток. Для проверки, достигнут ли конец файла, можно использовать функцию ios::eof(), имеющую прототип int eof();

Завершив операции ввода-вывода, необходимо закрыть файл, вызвав функцию-член close() с прототипом void close():

ofs.close();

Закрытие файла происходит автоматически при выходе потокового объекта из области существования.

Рассмотрим пример, демонстрирующий файловый ввод-вывод с использованием потоков:

#include <fstream>

#include <iostream>

using namespace std;

void main()

{

 int n = 50;

 // Открываем файл для вывода

 ofstream ofs( "test.txt" );

 if ( ! ofs )

 {

 cout << "Файл не открыт.\n";

 return;

}

 

ofs << "Hello!\n" << n;

 // Закрываем файл

ofs.close();

 // открываем тот же файл для ввода

 ifstream file("Test.txt");

 if ( ! file )

 {

 cout << "Файл не открыт.\n";

 return;

}

 char str[128];

file >> str >> n;

 cout << str << " " << n << endl;

 // Закрываем файл

file.close();

}


 

А также другие работы, которые могут Вас заинтересовать

82520. Задания, направленные на развитие логического мышления младших школьников с ЗПР 61.5 KB
  Примеры такого анализа: Данное упражнение можно использовать на уроках математики. Данное упражнение рекомендуется использовать на уроках математики ознакомления с окружающим миром а также труда 2. Упражнение можно использовать на уроках математики. Это задание рекомендуется использовать на уроках математики ознакомления с окружающим миром и труда.
82521. Развитие мышления у детей с ЗПР младшего школьного возраста 35.5 KB
  Особый интерес представляет метод обучения детей модельному конструированию разработанный А. Важным при таком способе обучения конструированию является то что мыслительные процессы детей приобретают опосредованный характер нежели при конструировании по образцу. Для этого необходим достаточно высокий уровень абстрагирования что дает возможность формированию у детей специфических способов соотнесения определенных свойств условий с соответствующими свойствами постройки.
82522. Развитие мышления у младших школьников с ОНР 4.26 MB
  Отгадывание ребусов: отгадать слово из двух предлогов: найти в слове квас три предлога: Цель: развитие словеснологического мышления Установление простых аналогий навыков словообразования. Цель: развитие словеснологического мышления устойчивости и концентрации слухового внимания. Задание: определить что пропущено в рассказе: названия предметов предлоги или названия признаков Цель: развитие нагляднообразного мышления.
82523. Методы и приемы развития словесно-логического мышления учащихся с речевой патологией на уроках 83.5 KB
  Инструкция: Я буду говорить слово по звукам слогам а ты запиши его в тетради. а сани солома зэркало дворэц б первый слогпу третий слог вик второй слог хо; первый слог пу третий слог ка второй слогшин второй слог шок первый слог пу третий слог ка второй слог пуш первый слого Дополнительное задание: подчеркнуть лишнее слово. первый слог са второй слог мо третий слог кат третий слог ле второй слог то первый слог вер первый слог са третий слог ник...
82524. Дидактические игры и упражнения, направленные на развитие мышления у детей с умственной отсталостью дошкольного возраста 100.5 KB
  Педагог просит ребенка отнести на один стул такие указательный жест а на другой такие. Педагог дает одному из детей коробку с круглой прорезью а другому с квадратной и ставит условие: отобрать сразу все что можно протолкнуть в данную коробку. Если он выбирает правильно например шары но берет не все а только один или два шара педагог напоминает ему что нужно взять все такие указывает на шары. После того как дети отберут и бросят в прорези коробок нужные формы педагог подводит итог: Правильно Таня собрала все шары и...
82525. Игры для развития мышления и воображения у детей дошкольного возраста с нарушением слуха 88.5 KB
  Педагог просит: Достань тележку. Если ребенок вытянул тесьму то педагог вставляет ее снова обязательно за экраном. Если все же ребенок не сумел сделать сам педагог медленно показывает. Педагог предлагает детям выложить из своих фишек узоры по картинке.
82526. Развитие мышления на уроках русского языка 96.5 KB
  Ход проведения: детям были даны карточки с нижеприведёнными упражнениями. Ход проведения: на уроке идёт беседа об известных модельерах анализируются модели одежды созданные ими. Ход проведения: детям говорится что им сейчас будут зачитываться слова и они должны в уме переставить буквы наоборот и тут же записать в тетрадь получившийся результат. Ход проведения: на доске зарисовывается схема.
82527. Развитие памяти и мышления у детей с ОВЗ на занятиях по дополнительной образовательной программе «Я все умею делать сам, что не умею, научусь!» 38 KB
  Ведущий: Дети сейчас я прочитаю вам стихотворение Корнея Чуковского Путаница. Ведущий перед игрой проводит короткую беседу уточняя понимание детьми слов профессия действия. Ведущий. Ведущий.