Посимвольное Считывание Из Файла

  • Автор темы Polinka
  • Дата начала
P

Polinka

#1
Задание: С помощью текстового редактора создать файл,содержащий текст, длина которого не превышает 700 символов(длина строки не должна превышать 70 символов).
Имя файла должно иметь расширение dat.Написать программу,которая:
-выводит текст на экран дисплея;
-по нажатию произвольной клавиши выделяет в тексте заданное слово(ввести слово с клавиатуры);
-выводит текст на экран дисплея еще раз, заключая данное слово в кавычки.


Как сделать поиск посимвольно в файле текста (у меня в программе построчно)?
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"код С++"</div></div><div class="sp-body"><div class="sp-content">#include <iostream>
#include <fstream>

using namespace std ;

/*
В одной из папок проекта, точно не помню в какой, должен лежать файл in.txt с текстом.
Введённая фраза выделяется кавычками (") по бокам.
*/

const int STR_LEN = 257 ;

void menu(ifstream& in) {
int action(1) ; //переменная для выборай действия
while(action) {
system("cls") ; //очищаем каждый раз экран переди даилогом
cout << "Что вы хотите сделать?" << endl
<< "1 - Вывести текст." << endl
<< "2 - Вывести текст с выделенной фразой." << endl
<< ">: " ;
cin >> action ;
switch(action) {
case 1 : {
char str[STR_LEN] ;
str[STR_LEN-1] = '\0' ;
in.clear() ; //сбрасываем все флаги ошибок, это нужно, если до этого при чтении достигался конец файла
in.seekg(0) ; //устанавливаем позицию чтения в начало файла
while(!in.eof()) { //в цикле проверяем не достигнут ли конец файла
if (in.fail()) { //если строка будет длиннее 256 символов
in.clear() ; //сбрасываем флаги ошибок
}
in.getline( str, STR_LEN-1 ) ; //засовываем в str строку длинной 256 символов из потока in
cout << str << endl ; //выводим на экран считанную строку
}
system("pause") ;
break ;
}
case 2 : {
cin.get() ;
cout << "Введите фразу для выделения: " ;
const int length = 30 ; //длинна фразы для выделения
char fraza[length] ;
cin.getline(fraza, length-1) ;
char str[STR_LEN] ;
str[STR_LEN-1] = '\0' ;
in.clear() ; //то же самое, что в case 1
in.seekg(0) ; //устанавливаем указатель считывания в положение 0 (начало файла)
while(!in.eof()) {
if (in.fail()) {
in.clear() ;
}
in.getline( str, STR_LEN-1 ) ;
int pos ;
pos = strstr(str, fraza)- str ; //ищем позицию вхождение искомой строки в строке, считанной из файла
//в случае не нахождения строки strstr() возвращает -1
if ( pos >= 0 ) { //если находим такую строку
for ( int i=0 ; i<pos ; i++ ) //выводим часть строки до искомой фразы
cout << str ;
cout << '"' << fraza << '"' ; //выводим выделенную искому фразу
for ( int i=pos+strlen(fraza) ; str ; i++ ) { //выводим остаток строки
cout << str ;
}
cout << endl ;
}
else //если не находим вхождения, просто выводим строку
cout << str << endl ;
}
system("pause") ;
break ;
}
default :
action = 0 ;
}
}
}
int main ( int argc, char* argv[] ) {
setlocale ( LC_ALL, "RUSSIAN" ) ;

char inPatch[] = "in.txt" ; //название файла для открытия в относительнйо виде (c:/folder/123.txt - абсолютный)
ifstream in(inPatch) ; //создаём объект потокового класса ifstream (input file stream - входной файловый поток)
if(!in) { //проверяем открылся ли файл
cout << "Error opening file " << inPatch << '.' << endl ;
system("pause") ;
return 1 ;
}
menu(in) ; //вызываем меню для этого объекта
return 0 ;
}