Определить, сколько раз встретилось заданное слово в текстовом файле. 


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



ЗНАЕТЕ ЛИ ВЫ?

Определить, сколько раз встретилось заданное слово в текстовом файле.



Определим слово в тексте как последовательность алфавитно-цифровых символов, после которых следует либо знак пунктуации (точка, запятая, вопросительный знак, восклицательный знак), либо разделитель (один или несколько пробелов, символов табуляции ‘\t’ и символ конца строки ‘\n’. Для хранения заданного слова (оно вводится с клавиатуры) определим переменную word типа string.

Поскольку максимальная длина строки в файле неизвестна, будем читать файл пословно, помещая каждое очередное прочитанное слово в переменной сurword типа string. Такое чтение можно реализовать с помощью операции >>, которая в случае операнда типа string игнорирует все разделители, предваряющие текущее слово, и считывает символы текущего слова в переменную сurword, пока не встретится очередной разделитель. «Опознание» текущего слова должно осуществляться с учетом возможного наличия после него одного из знаков пунктуации. Для решения этой задачи определим глобальную функцию

bool equal(const string& cw, const string& w);

которая возвращает значение true, если текущее слово cw совпадает с заданным словом w с точностью до знака пунктуации, в противном случае – false.

 

// stdafx.h

#pragma once

 

#define WIN32_LEAN_AND_MEAN

#include <stdio.h>

#include <tchar.h>

 

// TODO: reference additional headers your program requires here

 

#include <string>

#include <fstream>

#include <iostream>

#include <conio.h>

using namespace std;

bool equal(const string& cw, const string& w);

 

////////////////////////////////////////////////////////////////////////

// main.cpp

 

#include "stdafx.h"

 

Int main ()

{

string word, curword;

cout << "input" << endl; cin >> word;

ifstream fin ("infile.txt", ios::in);

if(!fin) {cout << "error" << endl; _getch(); return 1;}

int count =0;

while (!fin.eof()) {

fin >> curword;

if (equal(curword, word)) count++;

}

cout << count << endl;

_getch();

return 0;

}

 

bool equal(const string& cw, const string& w)

{

char punct[]= {'.',',','?','!'};

if (cw==w) return true;

for (int i=0; i< sizeof(punct); ++i)

if (cw==w + punct[i]) return true;

return false;

}

 

Вывод вопросительных предложений

Считать текст из файла и вывести из него только вопросительные предложения.

Имеем текстовый файл неизвестного размера, состоящий из неизвестного количества предложений. Предложение может занимать несколько строк, поэтому читать файл построчно неудобно (сложный алгоритм). Будем читать файл пословно в переменную word типа string и отправлять каждое прочитанное слово в строковый поток sentence типа ostringstream, который будет хранилищем предложения. Так как при чтении из файла с помощью операции fin >> word, происходит потеря разделителей, то будем «заглядывать» в следующую позицию файлового потока fin с помощью операции peek(). При обнаружении символа-разделителя его нужно отправить в поток sentence и переместиться в потоке fin на следующую позицию, используя метод seekg(). Обнаружение символа-разделителя реализуем в глобальной функции isLimit().

 

// stdafx.h

#pragma once

 

#define WIN32_LEAN_AND_MEAN

#include <stdio.h>

#include <tchar.h>

 

#include <string>

#include <fstream>

#include <iostream>

#include <fstream>

#include <sstream>

#include <conio.h>

using namespace std;

bool isLimit(char c);

 

////////////////////////////////////////////////////////////////////////

// main.cpp

 

#include "stdafx.h"

 

Int main ()

{

ifstream fin ("aaaaa.txt", ios::in);

if(!fin) {cout << "error" << endl; _getch(); return 1;}

int count =0;

string word;

ostringstream sentence;

 

while (true) {

char symb;

while (isLimit(symb = fin.peek())) { //если разделитель

sentence << symb; //записывем его в поток

if (symb=='\n') break;

fin.seekg(1, ios::cur);

}

fin >> word; //читаем из файла слово

if (fin.eof()) break;

sentence << word; //записываем слово в строковый поток

char last = word[word.size() - 1]; //выделяем последний символ слова

if ((last=='.')|| (last == '!')) { //если предложение не?

sentence.str(""); //очистка строкового потока

continue;

}

if (last=='?') {

cout << sentence. str (); //вывод содержимого потока

sentence.str(""); //очистка потока

count++;

}

}

if (!count) cout << "? net " << endl;

 

_getch();

return 0;

}

 

bool isLimit(char c) {

char lim[]= {' ','\t','\n'};

for (int i=0; i< sizeof(lim); ++i)

if (c==lim[i]) return true;

return false;

}



Поделиться:


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

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