- •Часть 1 Строки и структуры
- •Содержание
- •Порядок выполнения лабораторных работ
- •Оборудование, технические средства, инструмент
- •6.2 Работа с предложениями текста
- •6.3 Работа со структурами и бинарными файлами
- •Void create(void) // Создание файла
- •Void view(void) // Просмотр файла
- •6.4. Задание 1
- •6.5 Задание 2
-
6.2 Работа с предложениями текста
В листинге 6.2 представлена программа, которая считывает текст из файла (рис. 6.3) и выводит на экран только вопросительные предложения из этого текста (рис. 6.4).
Исходными данными в этой задачи является текстовый файл неизвестного размера, состоящий из неизвестного количества предложений. Предложение может занимать несколько строк, поэтому ограничиться буфером на одну строку в данной задаче нельзя. Нужно выделить буфер, в который поместиться весь файл. Алгоритм решения задачи следующий: 1. Открыть файл. 2. Определить его длину в байтах.
3. Выделить в динамической памяти буфер соответствующего размера.
4. Считать файл с диска в буфер. 5. Анализируя буфер посимвольно, выделять предложения. Если предложение оканчивается вопросительным знаком, вывести его на экран.
Детализируем последний пункт алгоритма. Для вывода предложения необходимо хранить позиции его начала и конца. Предложение может оканчиваться точкой, восклицательным или вопросительным знаком. В первых двух случаях предложение пропускается. Это выражается в том, что значение позиции начала предложения обновляется. Оно устанавливается равным символу, следующему за текущим, и просмотр продолжается. В случае обнаружения вопросительного знака предложение выводится на экран, после чего также устанавливается новое значение позиции начала предложения.
Листинг 6.2 Вывод вопросительных предложений
#include <stdio.h>
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
char bufRus[256];
char* Rus(char* mes)
{ AnsiToOem(mes, bufRus);
return bufRus;
}
int main(void)
{ char ch[2]; FILE * f;
f=fopen("D:\\FileTXT\\text2.txt","r");
if (f != NULL)
{ // определяем длину файла
fseek(f,0,SEEK_END);
long len = ftell(f);
// выделяем буфер необходимого размера
char *buf=new char[len+1];
// смещаем указатель на начало файла и
// считываем файл в буфер
fseek(f,0,SEEK_SET);
fread(buf, len,1, f); buf[len]='\0';
// выделение предложений из текста
long n = 0; // позиция начала предложения
long i=0, j=0;
while(buf[i])
{ if (buf[i]== '?')
{ // вывод символов вопросительного
// предложения
for(j=n; j<=i; j++)
{ ch[0]=buf[j]; ch[1]='\0';
cout << Rus(ch);
}
n=i+1;
}
if (buf[i]=='.' || buf[i]== '!')
n=i+1;
i++;
}
fclose(f);
cout << endl;
} else
cout << "Файл не найден!\n";
}
Рисунок 6.3 – Файл с текстом
Рисунок 6.4 – Результат выполнения программы.
-
6.3 Работа со структурами и бинарными файлами
В листинге 6.3 представлена программа, которая
-
создает бинарный файл, в котором храниться информация о сотрудниках предприятия: фамилия и инициалы, год рождения, оклад.
-
Выводит на экран информацию, хранимую в бинарном файле, а также сведения о сотруднике по заданной фамилии и инициалам (рис. 6.5).
Листинг 6.3 Создание и обработка бинарного файла
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
const int l_name = 30;
struct Man
{ char name[l_name];
int birth_year;
float pay;
};
int compare(const void *manl, const void *man2);