Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Касаткин С., Раткевич И., Травова Н. - Лаборато...doc
Скачиваний:
3
Добавлен:
22.11.2019
Размер:
1.01 Mб
Скачать
  1. Программа выводит на экран n-ую строку файла

Программа иллюстрирует чтение данных из файла построчно.

#include<iostream>

#include<locale> //!!! Отвечает за работу с локализацией ОС

#include<iomanip>

#include<math.h>

#include<conio.h>

#include<String.h>

#include<ctype.h>

#include <stdlib.h>

#include<windows.h>

#include <fstream> // Этот файл обеспечивает работу с файлами

using namespace std;

int main()

{

if(SetConsoleCP(1251)==0)

{

cerr<<"Fialed to set codepage!"<<endl;

}

if(SetConsoleOutputCP(1251)==0)

{

cerr<<"Failed to set OUTPUT page!"<<endl;

}

ifstream inf; // Объявляем файл для чтения

char name[21]; // имя файла

char str[81]; // строка для чтения данных из файла

do // повторение программы до нажатия клавиши <Esc>

{

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

cin >> name;

inf.open(name);

if (!inf) // Если файл не открыт

{

cout<<"Файл не найден\n";

}

else

{

int k = 0; // счетчик прочитанных строк

while ( !inf.eof() ) // пока файл не закончен

{

inf.getline(str,80);

// считываем одну строку файла

k++; // увеличиваем счетчик строк

cout << str << endl;

if ( (k+1) % 23 == 0 )

// выводим текст на экран по 23 строки

{

cout<< "Нажмите любую клавишу";

_getch(); /* при нажатии любой клавиши выводится очередная часть текста */

}

}

int n; // номер строки, которую нужно вывести на экран

inf.seekg(0L, ios::beg); // возвращаемся в начало файла

inf.clear(); // сбрасываем признак конца файла

do

{

cout<<"Введите номер строки от 1 до "<< k << " ";

cin>>n;

}while ( n>k || n<1 );

for (int i=1; i<=n; i++)

inf.getline(str,80);

cout<<str<<endl; /* последнюю считанную строку выводим на экран */

}

inf.close(); /* если открытие файла повторяется, значит файл должен закрываться */

} while (_getch() !=27);

return 0;

}

Обратите внимание на то, что чтение файла осуществляется последовательно: чтобы прочитать n-ую строку файла, необходимо прочитать предыдущие (n-1) строк. Это вызвано тем, что строки разной длины и мы не можем определить, где начинается каждая строка. Решением проблемы может быть предварительное чтение файла с записью в массив позиции каждой строки. Работу с массивами мы будем разбирать в следующей лабораторной работе.

  1. Программа, которая переписывает текст из одного файла в другой, удаляя лиш­ние пробелы между словами и делая ширину текста максимум 70 символов

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

#include<iostream>

#include<iomanip>

#include<math.h>

#include<conio.h>

#include<String.h>

#include<ctype.h>

#include <stdlib.h>

#include<windows.h>

#include <fstream> // Этот файл обеспечивает работу с файлами

using namespace std;

int main()

{

if(SetConsoleCP(1251)==0)

{

cerr<<"Fialed to set codepage!"<<endl;

}

if(SetConsoleOutputCP(1251)==0)

{

cerr<<"Failed to set OUTPUT page!"<<endl;

}

ifstream inf("test.txt"); // Объявляем файл для чтения

fstream outf("rez.txt",ios::out);

// создаваемый файл (можно использовать как для записи, так и для чтения)

char str[81]; // строка для чтения нового файла

char slovo[71]; // 1 слово, считываемое из файла

char rez[81]; // строка для записи в новый файл

rez[0] = '\0'; // делаем строку пустой

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

cout<<"Файл не найден \n";

else

{

byte flag = 0; // признак первого слова

cout << "Исходный файл:\n";

while (!inf.eof()) // пока не конец файла

{

inf >> slovo ; // считывем слово из файла

cout<<slovo<< ' '; // выводим его на экран

if (strlen(rez)+strlen(slovo)+1<=70 && strlen(slovo))

/* если длина строки после добавления к ней нового слова не превысит 70 и слово не пустое */

{

if (flag) strcat(rez," ");

// если слово - не первое, добавляем пробел

strcat(rez,slovo); // добавляем слово

flag = 1; // в строке уже есть слово

}

else // если строка уже длинная

{

outf << rez << endl; // записываем ее в файл

*rez = '\0'; // строку делаем опять пустой

strcpy(rez,slovo); // копируем в нее слово

}

} //end while

if (*rez) outf << rez << endl;

// если последняя строка – не пустая, записываем ее в файл

outf.close(); // создаваемые файлы нужно закрывать

cout <<"\n\nНажмите любую клавишу \n";

_getch();

outf.open("rez.txt",ios::in);

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

cout << "\nНовый файл:\n";

while( !outf.eof()) // пока не конец файла

{

outf.getline(str,80); // считываем строку

cout << str << endl; // выводим ее на экран

}

}

_getch();

return 0;

}

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.