Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие С++- не книжкой_новое.doc
Скачиваний:
4
Добавлен:
04.11.2018
Размер:
765.44 Кб
Скачать

Void main ()

{

string s,s1,*s2;//Cоздали два объекта класса

//string и указатель на объект классса string

int k=0;

string razd=" ,.:";

/*Создали объект класса string, с помощью конструктора копирования для хранения разделителей между словами */

string glas="aeoiuy";

/*Создали объект класса string, с помощью конструктора копирования для хранения гласных*/

cout<<"Enter string ";

getline(cin,s);//Считали строку из потока cin

s2=new string [s.length()/2];//Выделили память под

//массив строк

s1=s;

/* Скопировали строку s в строку s1 с помощью переопредленной операции = */

int n= s1.find_first_of(razd);

/*Нашли позицию первого разделителя в строке s1*/

while (n!=NPOS)

{

if (n)

{

s2[k]=s1.substr(0,n);

/*Сохранили подстроку до разделителя как очередной элемент массива */

if (glas.find(s2[k][0])!=NPOS)cout<<"\n"<<s2[k];

k++;

}

s1=s1.substr(n+1);

/*Далее рассматриваем только оставшуюся часть строки*/

n=s1.find_first_of(razd);//Нашли позицию очередного

//разделителя

}

s2[k]=s1; //Обработка последнего слова

if (glas.find(s2[k][0])!=NPOS)cout<<"\n"<<s2[k];

}

Отметим, что в данном решении задачи, так же как и в решении задачи в примере 6.3. массив слов введен лишь для демонстрации возможности сохранения слов в массиве для дальнейшей обработки. Однако, в данной задачи не предполагается дальнейшая обработка выделенных из строки слов, поэтому нет необходимости сохранять их в массиве. Поэтому целесообразнее не определять массив строк  string *s2, а определить лишь одну строку string s2, которую и использовать для обработки очередного выделенного слова.

Задание 3. Класс fstream

Каждому студенту рекомендуется выполнить хотя бы одно из упражнений 1-12 задания 4 из параграфа 1.6, использую класс fstream.

Для поддержки файлового ввода и вывода стандартная библиотека С++ содержит классы ifstream (входной файловый поток), ofstream(выходной файловый поток), fstream (двунаправленный файловый поток). Файловый потоки обеспечивают более надежный ввод/вывод, чем стандартные функции библиотеки С. Для использования файловый потоков необходимо подключить к программе заголовочный файл <fsteam.h>.

Над файловыми потоками можно выполнять следующие операции:

  • создание потока (потокового объекта)

  • открытие потока и связывание его с файлом

  • обмен с потоком (ввод/вывод)

  • закрытие файла (отсоединение от потока).

Создание потока можно осуществитьс с помощью конструктора без параметров, например

ofstream outFile;// создан выходной поток

Чтобы свзяать поток, созданный таким образом, с файлом используют метод open().

Например,

outFile.open(“1.txt”);

Метод open() может иметь следующие параметры

ios::in Открыть файл для ввода

ios::out Открыть файл для вывода

ios::ate Установить указатель на конец файла

ios::app Открыть в режиме добавления в конец файла

ios::trunc Если файл сущесвтует обрезать его до нулевой длины

ios::binary Открыть в двоичном режиме

ios::nocreate Если файл не существует, установить поток в нулевое значение

ios::noreplace Если файл существует, устновить поток в нулевое значение

Обмен данных с файлами входными и выходными потоками осуществяется также как со стандарными потоками cin и cout соотвественно – с помощью опраций чтения из потока (>>) и записи в поток (<<) и специальных методов.

Например,

char c, s[20];

inFile.get(c);// считали очередной символ в переменную с

inFile>>c;//считали очердной символ в переменную с

inFile.getline(s,sizeof(s)); // считали строку в массив s

outFile.put(c); // записали символ с

outFile<<c<<s; //записали символ с и строку s

Контролировать, достигнут ли конец файла при считывании данных из потока, позволяет метод eof(), возращающий нулевое значение, если конец файла не достигнут и ненулевое в простивном случае.

При различных ошибочных ситуациях, напрмер переполнение диска или отсутсвия файла на диске, потоковый объект утанавливается в нулевое значение. Например,

ifstream inFile(“1.txt“);

if (!inFile) cout<<"Не существет такого файла!";

Для закрытия файла (отсоединения от потока) используют метод close(). Например,

outFile.close();

Пример. Решим задачу из примера 6.4, использую класс fstream. Дан текстовый файл, строки которого содержат не более m (m<=20) символов. Считать строки и записать их в файл result.txt в порядке считывания, причем каждая строка должна быть «перевернута».

#include <fstream.h>

void main ()

{

char filename[255];

cout<<"Введите имя файла ";

cin>>filename;

ifstream inFile(filename);

/*определили входной файловй поток (для чтения) и прикрепили к нему файл с именем filename */

if (inFile) // Если файл успешно открыт

{

ofstream outFile; //определили выходной файловый поток

//(для записи)

outFile.open("result.txt"); //присоединили файл с именем

//"result.txt" к выходному потоку

char s[20];// определяем массив для хранения

//считанной строки

while(!inFile.eof()) //Цикл считывания строк

{

inFile.getline(s,sizeof(s));// Считали очередную строку

int l=strlen(s);

if (s[l-1]!='\n') outFile<<s[l-1];

for (int j=l-2; j>=0; j--) outFile<<s[j];

//цикл записи символов строки в обратном порядке

outFile<<'\n';//запись символа новой строки

}

inFile.close();

outFile.close ();

cout<<"Файл записан";

}

else cout<<"Не существет такого файла!";

}