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



ЗНАЕТЕ ЛИ ВЫ?

Некоторые Стандартные функции работы со троками

Поиск

1.4.1 <string.h> (<cstring>) – функции работы со строками в стиле C

 

char *strcat(char *s1, char *s2);

Складывает строки

Функция добавляет s2 к s1 и возвращает s1. В конец результирующей строки добавляется нуль-символ.

 

char *strchr(char *s, int ch);

Ищет символ в строке

Функция возвращает указатель на первое вхождение символа ch в строку s, если его нет, то возвращается NULL.

 

int strcmp(char *s1, char *s2);

Сравнивает строки

Функция сравнивает строки и возвращает отрицательное (если s1 меньше s2), нулевое (если s1 равно s2) или положительное (если s1 больше s2) значение.

 

char *strcpy(char *s1, char *s2);

Копирует одну строку в другую

Функция копирует s2 в s1 и возвращает s1.

 

char *strncpy(char *s1, char *s2, size_t n);

Копирует первые n символов одной строки в другую

Функция копирует не более n символов из s2 в s1 и возвращает s1. Если длина исходной строки превышает или равна n, нуль-символ в конец строки s1 не добавляется. В противном случае строка дополняется нуль-символами до n-го символа. Если строки перекрываются, поведение не определено.

 

char *strrchr(char *s,int ch);

Ищет символ в строке

Функция возвращает указатель на первое вхождение символа ch в строку s справа, если его нет, возвращает NULL.

 

char *strstr(char *s1, char *s2);

Ищет подстроку в строке

Функция выполняет поиск первого вхождения подстроки s2 в строку s1. В случае удачного поиска, возвращает указатель на элемент из s1, с которого начинается s2, и NULL в противном случае.

 

double strtod(const char *str, char **end);

Преобразует строку в число

Функция преобразует строку символов в числовое значение и возвращает его. При переполнении возвращает +/-HUGE_VAL При невозможности выполнить преобразование или исчезновении порядка возвращает 0. В обоих последних случаях errno устанавливается в ERANGE. end указывает на символ, на котором преобразование завершается.

 

char *strtok(char *s1, char *s2);

Выделяет из строки лексемы

Функция возвращает следующую лексему из s1, отделенную любым из символов из набора s2.

 

1.4.2<ctype.h> (<cctype>) – функции классификации и преобразования типов

 

int tolower(int ch);

Возвращает символ в нижнем регистре

Функция получает параметр ch и возвращает его в нижнем регистре. В параметре ch используется только младший байт.

 

int toupper(int ch);

Возвращает символ в верхнем регистре

Функция получает параметр ch и возвращает его в верхнем регистре. В параметре ch используется только младший байт.

 

int isalnum(int ch);

Проверяет, является ли символ буквой или цифрой

Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является буквой или цифрой, или false в противном случае.

 

int isalpha(int ch);

Проверяет, является ли символ буквой

Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является буквой, или false в противном случае.

 

int isdigit(int ch);

Проверяет, является ли символ цифрой

Функция выделяет младший байт параметра ch и возвращает значение true, если символ ch является цифрой, или false в противном случае.

 

2) Работа с файлами в С++

Файл – именованный набор байтов, который может быть сохранен на некотором накопителе. Под файлом понимается некоторая последовательность байтов, которая имеет своё, уникальное имя, например файл.txt. В одной директории не могут находиться файлы с одинаковыми именами. Под именем файла понимается не только его название, но и расширение, например: file.txt и file.dat— разные файлы, хоть и имеют одинаковые названия. Существует такое понятие, как полное имя файла – это полный адрес к директории файла с указанием имени файла, например: D:\docs\file.txt. Важно понимать эти базовые понятия, иначе сложно будет работать с файлами.

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

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

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

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

Почему необходимо создавать объект класса ofstream, а не класса ifstream? Потому, что нужно сделать запись в файл, а если бы нужно было считать данные из файла, то создавался бы объект класса ifstream.

  // создаём объект для записи в файл ofstream /*имя объекта*/; // объект класса ofstream

Назовём объект – fout, Вот что получится:

  ofstream fout;

Для чего нам объект? Объект необходим, чтобы можно было выполнять запись в файл. Уже объект создан, но не связан с файлом, в который нужно записать строку.

  fout.open("cppstudio.txt"); // связываем объект с файлом

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

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

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

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

Итог – создан файл со строкой Работа с файлами в С++.

Объединим весь код и получим следующую программу.

#include <fstream>

using namespace std;

 

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

{

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

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

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

system("pause");

return 0;

}

 

Осталось проверить правильность работы программы, а для этого открываем файл cppstudio.txt и смотрим его содержимое, должно быть — Работа с файлами в С++.

Для того чтобы прочитать файл понадобится выполнить те же шаги, что и при записи в файл с небольшими изменениями:

  1. создать объект класса ifstream и связать его с файлом, из которого будет производиться считывание;
  2. прочитать файл;
  3. закрыть файл.

#include <fstream>

#include <iostream>

using namespace std;

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

{

setlocale(LC_ALL, "rus"); // корректное отображение Кириллицы

char buff[50]; // буфер промежуточного хранения считываемого из файла текста

ifstream fin("cppstudio.txt "); // (ВВЕЛИ НЕ КОРРЕКТНОЕ ИМЯ ФАЙЛА)

 

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

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

else

{

fin >> buff; // считали первое слово из файла

cout << buff << endl; // напечатали это слово

 

fin.getline(buff, 50); // считали строку из файла

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

cout << buff << endl; // напечатали эту строку

}

system("pause");

return 0;

}

 

В программе показаны два способа чтения из файла, первый – используя операцию передачи в поток, второй – используя функцию getline(). В первом случае считывается только первое слово, а во втором случае считывается строка, длинной 50 символов. Но так как в файле осталось меньше 50 символов, то считываются символы включительно до последнего. Обратите внимание на то, что считывание во второй раз (строка 17) продолжилось, после первого слова, а не с начала, так как первое слово было прочитано в строке 14. Результат работы программы показан на рисунке 1.

Рисунок 1 — Работа с файлами в С++

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

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

Цель и порядок работы

Цель работы – ознакомиться с возможностями ввода-вывода языка C++, освоить основные операции работы со строками и файлами.

 

Порядок выполнения работы:

- ознакомиться с описанием лабораторной работы;

- получить задание у преподавателя, согласно своему варианту;

- написать программу и отладить ее на ЭВМ;

- оформить отчет.

Контрольные вопросы

1. Какие виды строк существуют в C++?

2. Как объявить C-строку?

3. Как осуществляется ввод-вывод строк?

4. Какие операции над строками вы знаете?

5. Перечислите операции над символами?

6. Перечислите стандартные потоки ввода-вывода?

7. Как создать файловый поток?

8. Какие режимы открытия файлов существуют?

9. Что такое двоичный режим ввода-вывода?

10. Что такое текстовый режим ввода-вывода?

11. Как осуществляется чтение символов и строк?

12. Как изменить текущую позицию в файле?

13. Как узнать текущую позицию в файле?

14. Для чего используется метод clear()?

Варианты заданий

Вариант 1

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

 

Вариант 2

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

 

Вариант 3

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

 

Вариант 4

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

 

Вариант 5

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

 

Вариант 6

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

 

Вариант 7

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

 

Вариант 8

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

 

Вариант 9

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

 

Вариант 10

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

 

Вариант 11

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

 

Вариант 12

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

 

Вариант 13

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

 

Вариант 14

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

 

Вариант 15

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

 

Вариант 16

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

 

Вариант 17

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

 

Вариант 18

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

 

Содержание отчета

1) Титульный лист.

2) Наименование и цель работы.

3) Краткое теоретическое описание.

4) Задание на лабораторную работу.

5) Схема алгоритма.

6) Листинг программы.

7) Результаты выполнения программы.

 




Поделиться:


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

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