Пример 3. Поиск вхождения слова в файле




 

#include "stdafx.h"

#include <iostream>

#include <fstream>

#include <string>

 

using namespace std;

 

int main()

{

setlocale(LC_ALL, "Russian");

 

const int len = 81;

char word[len], line[len], end_word[] = "done";

 

//пересоздадим файл и откроем для чтения/записи

fstream f("lab11.txt", ios::in | ios::out | ios::trunc);

if (!f)

{

cout << "Ошибка открытия файла" << endl;

return -1;

}

 

//введем несколько строк для дальнейшего поиска в них

do

{

cin >> line;

//с файловым потоком можно работать как со стандартными cin и cout

f << line << endl;

}

//продолжаем пока не введем done

while (strcmp(line, end_word));

 

//сбросим файловый поток на начало

f.seekg(0);

 

cout << "Содержимое файла: " << endl;

 

//содержимое файла на экран

//выполняем пока не достигнем конца файла

while (!f.eof())

{

f >> line;

cout << line << endl;

}

 

 

cout << "Введите слово для поиска: ";

cin >> word;

 

//сбрасываем бит-признак конца файла eofbit

f.clear();

 

//сбросим файловый поток на начало

f.seekg(0);

 

//определим длину искомого слова

size_t l_word = strlen(word);

 

//счетчик вхождения слова

int wc = 0;

//читаем построчно и ищем слово word в строке

while (f.getline(line, len))

{

//поместим указатель p на начало строки

char *p = line;

//strstr возвращает указатель

// на элемент из строки p с которого начинается word

while (p = strstr(p, word))

{

//используем указатель не текущую позицию в строке

char *c = p;

 

//переместим p на символ сразу за концом слова

p += l_word;

 

//проверим стоит ли наше слово отдельно

//или это просто подстрока в другом (большем) слове

 

//проверим совпадает ли начало слова с началом строки

if (c!= line)

//проверим символ перед началом слова

//на принадлежность к разделителям

if (!ispunct(*(c-1)) &&!isspace(*(c-1)))

//начинается не с начала строки и

//не с разделителя => ищем дальше

continue;

 

//символы перед началом слова подходят

//проверяем символы за окончанием слова

//если это пробелы, символы пунктуации

//или конец строки => увеличиваем счетчик слов

if (ispunct(*p) || isspace(*p) || (*p == '\0'))

{

wc++;

cout << "Слово найдено" <<endl;

}

}

}

 

cout << "Количество вхождений слова: "<< wc << endl;

 

return 0;

}

 

Замечание. Когда эта программа открывает уже существующий файл, он усекается до нулевой длины (т.е. все его данные теряются). Если необходимо работать с уже имеющимися в файле данными, нужно убрать бит ios::trunc из режима открытия потока.

 

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

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

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

3. Как

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

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

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

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

Задания на текстовые файлы

Все задания в основном направлены на освоение техники работы с файлами. Программы должны обрабатывать файлы, созданные в редакторе «Блокнот» (Windows) или файлы Word, сохраненные как текст DOS.

1. Дано два файла. Получить третий, содержащий поочередно строки исходных двух файлов.

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

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

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

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

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

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

8. Дан файл, содержащий текст. Сформировать другой файл, содержащий нечетные строки первого файла.

9. Дан файл. Записать в другой файл только те строки, которые начинаются с заданной буквы.

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

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

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

 

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

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

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

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

17. Дан файл, строки которого могут содержать и числа, и слова. Сформировать из него другой файл, содержащий только числа.

18. Дан файл, содержащий целые числа. Записать их в другие два файла, при этом в первый записать четные, а во второй – нечетные числа.

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

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

21. Дан файл. Записать из него в другой файл только те строки, которые начинаются с заглавной буквы.

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

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-06-03 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: