Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

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



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

 

Теоретические сведения

 

Для выполнения файлового ввода-вывода в программу необходимо включить заголовочный файл fstream.h.

 

Открытие и закрытие файлов

 

В С++ файл открывается путём состыковки его с потоком. Имеется три типа потоков: ввода, вывода и ввода-вывода. Для открытия потока ввода необходимо объявить его как объект класса ifstream. Для открытия потока вывода необходимо объявить его как объект класса оfstream. Потоки, которые выполняют как ввод, так и вывод, должны быть объявлены как объекты класса fstream. Например, следующий фрагмент программы создаёт один поток ввода, один поток вывода и один поток, способный выполнять как ввод, так и вывод:

 

ifstream in;

 

ofstream out;

 

fstream both;

 

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

 

void open(const char *filename, int mode, int access=filebuf::openprot);

 

Здесь filename является именем файла и может включать указание пути. Величина mode определяет, каким способом открывается файл. Mode может принимать одно или более из следующих значений, (определённых в заголовочном файле fstream.h):

 

ios::app

ios::ate

ios::binary

ios::in

ios::nocreate

ios::noreplace

ios::out

ios::trunc

 

Можно комбинировать два и более из этих значений, используя побитовое ИЛИ.

ios::app указывает на то, что выводимые данные будут добавляться в конец файла. Это значение может быть использовано только для файлов, для которых возможен вывод. Использование ios::ate вызывает поиск конца файла в момент открытия файла.

ios::in задаёт возможность ввода из файла, ios::out указывает, что файл предназначен для вывода. Однако создание потока с использованием ifstream задаёт режим ввода, а создание потока с использованием оfstream задаёт режим вывода, и в этих случаях нет необходимости задавать указанные выше величины.

ios::nocreate задаёт такой режим, при котором функция open() может открыть только существующий файл. ios::noreplace не позволяет открыть файл функции open(), если файл уже существует, но не указаны атрибуты ios::ate или ios::app.

ios::trunc обусловливает уничтожение содержимого файла с заданным именем и усечение длины файла до нуля.

ios::binary обусловливает открытие файла для двоичных операций. Это означает, что не будет никаких преобразований символов.



Величина access определяет, каким образом осуществляется доступ к файлу. Обычно эти атрибуты оставляются по умолчанию, что соответствует нормальному файлу.

В следующем фрагменте открывается нормальный файл для вывода

 

ofstream.h

out.open(“test”, ios::out);

 

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

 

out.open(“test”);

 

Для того чтобы открыть поток одновременно для ввода и вывода, необходимо задать обе величины ios::out и ios::in для режима mode, как показано в следующем примере:

 

fstream mystream;

mystream.open(“test”, ios::in | ios::out);

 

Если функции open() не удаётся открыть поток, то поток останется равным NULL.

Хотя открытие файла с использованием функции open() является вполне допустимым, в большинстве случаев так не делается, потому что класс ifstream, ofstream и fstream содержат конструкторы, открывающие файл. Конструкторы имеют те же параметры и значения по умолчанию, что и функция open(). Поэтому наиболее типичный способ открытия файла выглядит следующим образом:

 

ifstream mystream(“myfile”);

 

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

 

ifstream mystream(“myfile”);

if (!mystream) {

cout << “Cannot open file.\n”;

// обработка ошибки

}

 

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

 

mystream.close();

 

Определение конца файла

 

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

 

int eof();

 

При достижении конца файла она возвращает ненулевое число, в противном случае возвращает ноль.

 

Для того, чтобы писать в текстовые файлы или читать из них, достаточно воспользоваться операциями << и >> для открытого потока. Например, следующая программа записывает целое число, число с плавающей точкой и строку в файл test:

 

#include <iostream>

#include <fstream>

using namespace std;

 

int main()

{

ofstream out("test");

if(!out) {

cout << "Cannot open file.\n";

return 1;

}

 

out << 10 << " " << 123.23 << "\n";

out << "This is a short text file.\n";

 

out.close();

 

return 0;

}

 

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

 

#include <iostream>

#include <fstream>

using namespace std;

 

int main()

{

char ch;

int i;

float f;

char str[80];

 

ifstream in(“test”);

if (!in) {

cout << “Cannot open file.\n”;

return 1;

}

 

in >> i;

in >> f;

in >> ch;

in >> str;

 

in.close();

return 0;

}

 

Обычно для контроля ошибок при вводе-выводе используется функция-метод потока rdstate(). Функция возвращает значение типа int, которое можно сравнить с флагами (фиксированными значениями) определенными в ios.

При использовании оператора >> для чтения файлов надо иметь ввиду, что происходят преобразования символов.

Для предотвращения ошибок рекомендуется пользоваться функцией getline(). На следующем листинге приведёна программа, которая считывает числа типа int разделённые пробелами (одним или несколькими) и выводит их на консоль. Для преобразования строки в число используется стандартная функция atoi(), для контроля ошибок стандартная переменная errno (подключен заголовочный файл errno.h), для контроля ошибок ввода-вывода функция fail().

 

Листинг

 

#include <iostream>

#include <fstream>

#include <errno.h>

using namespace std;

 

int main(void)

{

ifstream in("test.txt");

if(!in){

cout << "Cannot open file!\n";

return 0;

}

char str[1024];

int temp;

unsigned int i;

while(!in.eof()){

in.getline(str,1024,' ');

if(str[0] == '\0') continue;

temp = atoi(str);

if(errno==ERANGE)

{

cout << "Error! Number out of range!\n";

return 0;

}

if(!(((str[0]>='0') && (str[0]<='9'))||(str[0] == '-')||(str[0] == '+')))

{

cout << "Error! In file is no integer symbols!\n";

return 0;

}

for(i=1;i<strlen(str);i++) if((str[i]<'0')||(str[i]>'9'))

{

cout << "Error! In file is no integer symbols!\n";

return 0;

}

if(in.fail()) {

cout << "Stream error! Programm stop!\n";

return 0;

}

cout << temp << endl;

}

 

in.close();

return 0;

}

 

Номер варианта

 

Задание

1, 8, 15, 22, 29

Текстовый файл содержит числа типа int разделённые пробелами (одним или несколькими), в конце файла также могут быть пробелы. Вычислить среднее арифметическое этих чисел и их количество. Поместить среднее арифметическое и количество чисел в другой текстовый файл. Снабдить соответствующим комментарием.

2, 9, 16, 23, 30

Текстовый файл содержит неотрицательные числа типа int разделённые пробелами (одним или несколькими), в конце файла также могут быть пробелы. Вычислить среднее геометрическое этих чисел и их количество. Поместить среднее геометрическое и количество чисел в другой текстовый файл. Снабдить соответствующим комментарием.

3, 10, 17, 24, 31

Текстовый файл содержит один символ и целые числа, разделённые пробелами (одним или несколькими), в конце файла также могут быть пробелы. Если символ в начале файла равен 'a', то поместить чётные числа в один текстовый файл, нечётные числа в другой текстовый файл. Если символ в начале файла равен 'b', то поместить числа кратные 3 в один текстовый файл, не кратные 3 в другой текстовый файл.

4, 11, 18, 25, 32

Текстовый файл содержит целые числа разделённые пробелами (одним или несколькими), в конце файла также могут быть пробелы. Поместить их наибольший общий делитель в текстовый файл.

5, 12, 19, 26

Текстовый файл содержит одну строку и числа типа double разделённые пробелами (одним или несколькими), в конце файла также могут быть пробелы.

Если строка равна “sin”, то вычислить значение функции синуса от этих чисел. Поместить их в другой текстовый файл.

Если строка равна “cos”, то вычислить значение функции косинуса от этих чисел. Поместить их в другой текстовый файл.

6, 13, 20, 27

Текстовый файл содержит числа типа double, разделённые пробелами (одним или несколькими), в конце файла также могут быть пробелы. Вычислить среднее арифметическое для каждой пары соседних чисел. Поместить средние арифметические каждой пары соседних чисел в другой текстовый файл.

7, 14, 21, 28

Текстовый файл содержит целые числа разделенные пробелами (одним или несколькими), в конце файла также могут быть пробелы. Поместить их наименьшее общее кратное в текстовый файл.

 


Дата добавления: 2015-08-29; просмотров: 24 | Нарушение авторских прав




<== предыдущая лекция | следующая лекция ==>
Исследование амплитудно-модулированных сигналов | o 0

mybiblioteka.su - 2015-2024 год. (0.035 сек.)