Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Программа выводит на экран 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) строк. Это вызвано тем, что строки разной длины и мы не можем определить, где начинается каждая строка. Решением проблемы может быть предварительное чтение файла с записью в массив позиции каждой строки. Работу с массивами мы будем разбирать в следующей лабораторной работе.

4. Программа, которая переписывает текст из одного файла в другой, удаляя лиш­ние пробелы между словами и делая ширину текста максимум 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;

}

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

#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;

// Функция, которая будет выполнять команду “Заменить”

void Replace (char*& str, char* olds,char *news)

/* параметрами функции являются ссылка на указатель, который хранит адрес строки, слово, которое нужно заменить, и новое слово.

Функция будет изменять указатель (адрес строки) */

{

char* rez = new char[2*strlen(str)];

/* новая строка; длина строки может увеличиться в результате замены, поэтому выделим память в 2 раза больше, чем длина исходной строки */

unsigned char slovo[31]; // 1 слово из строки

unsigned char *s = reinterpret_cast<unsigned char*>(str), *r = reinterpret_cast<unsigned char*>(rez), *sl; /* указатели, с помощью которых мы будем двигаться по строке и обрабатывать символ за символом */

while (*s) // пока не достигнут конец строки

{

sl = slovo;

// устанавливаем указатель sl на область памяти для хранения слова

while (*s > 0 && *s <= ' ') *r++ = *s++;

// Скопировали в результирующую строку пробелы

while (*s > ' ' && *s < 1<<8) *sl++ = *s++;

// Скопировали слово

*sl = '\0'; // записали признак конца слова

if (strcmp(reinterpret_cast<char*>(slovo), olds))

// Если очередное слово не нужно заменять

sl = slovo;

// устанавливаем указатель sl на считанное слово

else

sl = reinterpret_cast<unsigned char*>(news);

// иначе на новое слово

while (*sl) *r++ = *sl++;

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

}

*r = '\0'; // записываем признак конца строки

delete []str; // удаляем из памяти старую строку

str = rez; // теперь указатель str хранит адрес новой строки

}

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 = new char[81]; // строка для чтения файла

if (!inf)

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

else

{

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

{

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

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

Replace(str, "$$", "???");

// заменяем одно слово на другое

outf << str << endl; // записываем новую строку в файл

}

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

// выводим полученный файл на экран:

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

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

while(!outf.eof())

{

outf.getline(str,81);

cout<<str<<endl;

}

}

delete str;

_getch();

return 0;

}

 





Поделиться с друзьями:


Дата добавления: 2016-11-24; Мы поможем в написании ваших работ!; просмотров: 531 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Своим успехом я обязана тому, что никогда не оправдывалась и не принимала оправданий от других. © Флоренс Найтингейл
==> читать все изречения...

2407 - | 2226 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.008 с.