Следующий код иллюстрирует технику работы с классами, встроенными объектами и функциями билиотеки STL, ориентированными на потоки ввода-вывода и файловые буферы. Кроме того, здесь вы учитесь использовать указатели. Весь код разработан доц. С.А. Антоновым.
Изящество решения основано на том, что класс fstream библиотеки STL позволяет довольно просто манипулировать такими частями текстовых строк, как слова. Например, применяя операцию fs >> buf; (здесь, fs—это объект класса fstream, а buf—массив типа char[]), можно скопировать в память очередное слово произвольной (неизвестной заранее) длины. Секрет в том, что операция >> переопределена в классе fstream и хорошо работает. Алгоритм ниже использует этот результат.
Дело в том, что буфер в памяти buf, так же, как и буфер, поддерживаемый классом fstream, представляется одномерным непрерывным массивом символов без каких-либо разделяющих символов, символов перевода каретки и пр. Имея только buf, мы не сможем работать со словами, поэтому везде используется вспомогательный массив адресов (char* pointers[]), который хранит адреса начал всех слов в массиве buf. Ваша цель—понять как он используется и научиться этой технике.
Для иллюстрации одного из способов анализа строк, не заканчивающихся нулем, доц. А.В. Черносвитов добавил функцию StringCompare. Она сравнивает два слова (оценивает отношение их лексикографической упорядоченности. Например, "Alexander" меньше "Zorro", но больше "Abrakadabra").
В рассматриваемом подходе имеется сплошной поток слов. Для их сравнения (например, при сортировке слов) нельзя пользоваться стандартными функциями библиотеки языка С (С Runtime Library), так как они работают со строками, завершающиеся нулями. Функция strcmp, например, умеет сравнивать только такие строки. Об этом надо помнить.
Одно из решений (оно было у автора)—создавать обычные строки на ходу и сравнить их с помощью strcmp, другое решение—не копировать необычных строк в обычные, а создать свою функцию (утилиту) сравнения нестандартных строк. При этом экономится время. Небольшие изменения внесены также в алгоритм открытия существующего или создания нового файла. Новый файл создается только в том случае, если не существует файл, запрошенный пользователем.
Создайте новый проект консольного типа:
1. Выберите в меню команду File►New►Projects,
2. В появившемся окне диалога в поле Name задайте имя проекта: Parser,
3. Выберите месторасположение папки с проектом (в поле Location: задайте D:\Users\YourName),
4. Выберите тип проекта Win32 Console Project и нажмите OK,
5. Просмотрите настройки проекта на странице Application Settings,
6. Подтвердите выбор, нажав Finish.
7. В файл stdafx.h введите следующие директивы препроцессора:
#pragma once
#include <math.h>
#include <tchar.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <fstream>
using namespace std;
Файл stdafx.h, совместно с stdafx.cpp, используется для ускорения повторных компиляций. Подключаемые файлы библиотек, а они внушительны по размерам, компилируются только при первом запуске и если вы вносите изменения в свой код, то компилироваться будет только ваш файл— библиотеки уже скомпилированы и их объектный код расположен в файле Parser.pdb (см. папку Debug). После внесения изменений в stdafx.h происходит повторная компиляция всех файлов.
Задание. В результате выполнения задания вы приобретаете навыки, необходимые для работы с файлами и текстом. Выполняя программу по шагам (F10), объясняйте себе значения переменных, которые отладчик выводит в окно Autos. Примерная последовательность действий:
¨ Уничтожьте весь код в файле Parser.cpp и введите тот, что приведен ниже.
¨ Не забывайте, что последовательно нажимая F10 (выполняя программу в пошаговом режиме) в каждый данный момент времени указатель стоит на строке, которая еще не выполнена. Она будет выполнена на следующем шаге.
¨ Вы можете поставить (или убрать) точку останова (Breakpoint) на интересующей Вас строке кода (F9) и дать команду Go (F5).
¨ Когда выполнение остановится на указанной строке, вы можете продолжать пошаговое выполнение (F10). Выйти из режима отладки можно с помощью комбинации Shift+F5.
¨ Список команд, доступных в режиме отладки, можно увидеть в меню Debug.
// Parser.cpp : Эта программа демонстрирует работу с потоками ввода-вывода, буфером и указателями. Автор: доц. С.А.Антонов.
#include "stdafx.h"
const int gMaxLen = 254;
// Эта функция обеспечивает чтение информации с клавиатуры (признак окончания ввода - Ctrl-Z)
// и записывает информацию в поток вывода, связанный с файлом fstream - поток вывода
void ReadTextAndSave (fstream& fs)
{
cout<<"\nEnter several text strings:\n"; //Приглашение
char buf[gMaxLen + 1]; //Организуем буфер
//========== Цикл, пока не будет нажата комбинация Ctrl-Z
// пока в потоке ввода (по умолчанию связанным с клавиатурой) не появится код этой комбинации. Проверку этого производит функция eof.
while (!cin.eof())
{
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.