Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ПИ_ИКТ Программирование по С++ (1 семестр) _Хотов.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
5.83 Mб
Скачать

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

Режимы открытия файлов устанавливают характер использования файлов. Для установки режима в классе 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 просто переставляет флаг в конец файла и не ограничивает места записи.

ПРИМЕР

/*Условие задачи:

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

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

АЛГОРИТМ РЕШЕНИЯ:

1)считать весь файл в строку, для этого узнать размер файла и выделить столько памяти для строки и считать туда файл

2)разбить строку по предложениям с помощью лексем-разделителей, и посчитать кол-во пунктуаций в предложении

3)записать эту информацию в массив структуры

4)найти максимальное кол-во знаков пунктуации в массиве структур

5)вывести на экран предложения, содержащие максимальное количество знаков пунктуации

*/

#include <iostream>

#include <fstream>

#include <Windows.h>

using namespace std;

struct Sentence

{

char senten[400];

int count;

};

void main()

{

SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода

SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода

ifstream ifs("input.txt "); //

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

cout << "Файл не может быть открыт!\n"; // сообщить об этом

else

{

char delim[] = ".!?", punktuation[] = ",:;-'";

int length;

char * buffer;

// Получаем длину файла:

ifs.seekg(0, ios::end);

length = ifs.tellg();

ifs.seekg(0, ios::beg);

// Выделяем память соответственно размеру файла:

buffer = new char[length];

//Выделяем память для массива структур, где будем хранить каждое предложение и кол-во пунктуаций в ней.

Sentence *arrSentence = new Sentence[length / 100 + 10];

// считываем данные в буфер одним блоком:

ifs.read(buffer, length);

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

char *next_token1 = NULL;

char *next_token2 = NULL;

//разбиваем текст файла на предложения с помощью лексем

char *token1 = strtok_s(buffer, delim, &next_token1);

int n = 0, maxPunctuationCount = 0;

while (token1 != NULL)

{

strcpy(arrSentence[n].senten, token1);//копируем предложение в массив

int count = 0;

if (strtok_s(token1, punktuation, &next_token2) != NULL)

{

count = 1;

while (strtok_s(NULL, punktuation, &next_token2) != NULL)

count++;

}

arrSentence[n++].count = count;

//ищем максимальное кол-во пунктуаций в предложениях

maxPunctuationCount = maxPunctuationCount > count ? maxPunctuationCount : count;

//переходим к следующему предложению

token1 = strtok_s(NULL, delim, &next_token1);

}

cout << "Печатаем предложения с макс. кол-вом пунктуаций = " << maxPunctuationCount << endl;

for (int i = 0; i < n; i++)

if (arrSentence[i].count == maxPunctuationCount)

cout << arrSentence[i].senten;

delete[] arrSentence;

delete[] buffer;

}

cout << endl;

system("pause");

}

Лабораторная работа № 11. Работа со строками в C++. Потоки ввода-вывода. Файловые операции