Программа иллюстрирует чтение данных из файла построчно.
#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;
}