Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Вопрос 35. Методы открытия файлов для обмена информацией.

Поиск

Режимы открытия файлов

Методы открытия:

ios::app

ios::ate

ios::binary

ios::in

ios::out

ios::trunc

 

Режимы открытия файлов устанавливают характер использования файлов. Для установки режима в классе ios_base предусмотрены константы, которые определяют режим открытия файлов (см. Таблица 1).

 

Таблица 1 — режимы открытия файлов

Константа Описание

ios_base::in открыть файл для чтения

ios_base::out открыть файл для записи

ios_base::ate при открытии переместить указатель в конец файла

ios_base::app открыть файл для записи в конец файла

ios_base::trunc удалить содержимое файла, если он существует

ios_base::binary открытие файла в двоичном режиме

Режимы открытия файлов можно устанавливать непосредственно при создании объекта или при вызове функции open().

 

ofstream fout("cppstudio.txt", ios_base::app); // открываем файл для добавления информации к концу файла

fout.open("cppstudio.txt", ios_base::app); // открываем файл для добавления информации к концу файла

Режимы открытия файлов можно комбинировать с помощью поразрядной логической операции или |, например: ios_base::out | ios_base::trunc - открытие файла для записи, предварительно очистив его.

 

Объекты класса ofstream, при связке с файлами по умолчанию содержат режимы открытия файлов ios_base::out | ios_base::trunc. То есть файл будет создан, если не существует. Если же файл существует, то его содержимое будет удалено, а сам файл будет готов к записи. Объекты класса ifstream связываясь с файлом, имеют по умолчанию режим открытия файла ios_base::in - файл открыт только для чтения. Режим открытия файла ещё называют — флаг, для удобочитаемости в дальнейшем будем использовать именно этот термин. В таблице 1 перечислены далеко не все флаги, но для начала этих должно хватить.

 

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

 

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

 

число байт, отводимое под тип данных

максимальное значение, которое может хранить определённый тип данных.

Запись в файл должна выполняться в таком формате:

/* data type byte max value

bool = 1 255.00

char = 1 255.00

short int = 2 32767.00

unsigned short int = 2 65535.00

int = 4 2147483647.00

unsigned int = 4 4294967295.00

long int = 4 2147483647.00

unsigned long int = 4 4294967295.00

float = 4 2147483647.00

long float = 8 9223372036854775800.00

double = 8 9223372036854775800.00 */

Такая программа уже разрабатывалась ранее в разделе Типы данных С++, но там вся информация о типах данных выводилась на стандартное устройство вывода, а нам необходимо программу переделать так, чтобы информация записывалась в файл. Для этого необходимо открыть файл в режиме записи, с предварительным усечением текущей информации файла (строка 14). Как только файл создан и успешно открыт (строки 16 — 20), вместо оператора cout, в строке 22 используем объект fout. таким образом, вместо экрана информация о типах данных запишется в файл.

 

// write_file.cpp: определяет точку входа для консольного приложения.

 

#include "stdafx.h"

#include <iostream>

#include <fstream> // работа с файлами

#include <iomanip> // манипуляторы ввода/вывода

using namespace std;

 

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

{

setlocale(LC_ALL, "rus");

 

// связываем объект с файлом, при этом файл открываем в режиме записи, предварительно удаляя все данные из него

ofstream fout("data_types.txt", ios_base::out | ios_base::trunc);

 

if (!fout.is_open()) // если файл небыл открыт

{

cout << "Файл не может быть открыт или создан\n"; // напечатать соответствующее сообщение

return 1; // выполнить выход из программы

}

 

fout << " data type " << "byte" << " " << " max value " << endl // заголовки столбцов

<< "bool = " << sizeof(bool) << " " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных bool*/ << (pow(2,sizeof(bool) * 8.0) - 1) << endl

<< "char = " << sizeof(char) << " " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных char*/ << (pow(2,sizeof(char) * 8.0) - 1) << endl

<< "short int = " << sizeof(short int) << " " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных short int*/ << (pow(2,sizeof(short int) * 8.0 - 1) - 1) << endl

<< "unsigned short int = " << sizeof(unsigned short int) << " " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных unsigned short int*/ << (pow(2,sizeof(unsigned short int) * 8.0) - 1) << endl

<< "int = " << sizeof(int) << " " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных int*/ << (pow(2,sizeof(int) * 8.0 - 1) - 1) << endl

<< "unsigned int = " << sizeof(unsigned int) << " " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных unsigned int*/ << (pow(2,sizeof(unsigned int) * 8.0) - 1) << endl

<< "long int = " << sizeof(long int) << " " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных long int*/ << (pow(2,sizeof(long int) * 8.0 - 1) - 1) << endl

<< "unsigned long int = " << sizeof(unsigned long int) << " " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных undigned long int*/ << (pow(2,sizeof(unsigned long int) * 8.0) - 1) << endl

<< "float = " << sizeof(float) << " " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных float*/ << (pow(2,sizeof(float) * 8.0 - 1) - 1) << endl

<< "long float = " << sizeof(long float) << " " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных long float*/ << (pow(2,sizeof(long float) * 8.0 - 1) - 1) << endl

<< "double = " << sizeof(double) << " " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных double*/ << (pow(2,sizeof(double) * 8.0 - 1) - 1) << endl;

fout.close(); // программа больше не использует файл, поэтому его нужно закрыть

cout << "Данные успешно записаны в файл data_types.txt\n";

system("pause");

return 0;

}

Нельзя не заметить, что изменения в программе минимальны, а всё благодаря тому, что стандартный ввод/вывод и файловый ввод/вывод используются абсолютно аналогично. В конце программы, в строке 45 мы явно закрыли файл, хотя это и не обязательно, но считается хорошим тоном программирования. Стоит отметить, что все функции и манипуляторы используемые для форматирования стандартного ввода/вывода актуальны и для файлового ввода/вывода. Поэтому не возникло никаких ошибок, когда оператор cout был заменён объектом fout.

 

fp = fopen("my_file.txt","r"); может меняться режим открытия: для чтения, записи,чтения и записи.

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

fl=fopen("путь к файлу","режим работы файла");

Параметр "путь к файлу" указывает размещение файла на диске и обязательно содержит имя файла и может содержать имя логического диска и путь.

Параметр "режим работы файла"показывает, как будет использоваться файл:

"w" – для записи данных (вывод);

"r" – для чтения данных (ввод);

"a" – для добавления данных к существующим записям.

Примеры открытия файлов:

FILE *f_in,*_out;

f_in=fopen("My_file1","r");

f_out=fopen("My_file2","w");

Функция fopen() возвращает значение указателя на структуру типа файл. Если файл по каким-либо причинам не открывается, функция fopen() возвращает значение NULL.

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

Открытие файла для чтения в режиме "r" возможно только для созданного ранее файла, при этом указатель текущей позиции устанавливается на начало файла. Если открываемый на чтение файл не существует, функция fopen() возвращает пустой указатель со значением NULL.

Если файл открывается в режиме добавления данных "a", то указатель текущей позиции устанавливается на конец файла. Данные, ранее помещенные в файл, остаются без изменений. Если указывается несуществующий файл, то он создается заново.

Также можно указать дополнительные условия режима открытия файла:

"b" – двоичный поток;

"t" – текстовый поток;

"+" – обновление файла.

Пример

"r+" – чтение файла с обновлением, т. е. возможна перезапись данных с усечением;

"w+" – запись в файл и одновременно чтение;

"a+" – добавление данных и чтение.

Для поочередного выполнения чтения и записи в режиме "+" необходимо ручное позиционирование курсора.

 



Поделиться:


Последнее изменение этой страницы: 2016-08-15; просмотров: 920; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.137.167.205 (0.01 с.)