Добавлен: 25.05.2023
Просмотров: 262
Скачиваний: 3
Введение
В наши дни Visual C++ лидирует среди продуктов для программирования в среде Windows. Почти все, что можно сделать в Windows, программируется на Visual C++. За годы своего развития Visual C++ превратился в комплект невероятно мощных инструментов для Windows – программирования.
Большинство компьютерных программ работают с файлами, и поэтому возникает необходимость создавать, удалять, записывать, читать, открывать файлы [1, с.24][1].
Visual C++ обладает всеми необходимыми средствами для выполнения действий над файлами любой структуры, в том числе и текстовыми.
Целью данной курсовой работы является изучение механизмов языка программирования Visual C++ для работы с текстовыми файлами.
В выполнения поставленной цели необходимо выполнить следующие задачи:
- Ознакомится с краткой историей языков программирования. Произвести обзор Visual C++.
- Рассмотреть механизмы Visual C++ для работы с текстовыми файлами.
- Реализовать полученные знания для реализации практической части.
В работе использовались труды следующих отечественных и зарубежных авторов: Страуструп Бьерн, Васильев А.Н., Довбуш Г.Ф. и другие.
Страуструп Бьерн. Программирование: принципы и практика с использованием C++ / Бьерн Страуструп. - М.: Вильямс, 2016. - 1328 c.
Книга представляет собой введение в программирование, включая объектно-ориентированное и обобщенное программирование. Одновременно она представляет собой введение в язык C++, один из широко применяющихся языков программирования в современном мире. Отпечатано в АО «Первая Образцовая типография». Филиал «Чеховский Печатный Двор». 142300, Московская область, г. Чехов, ул. Полиграфистов, д. 1. ООО “И. Д. Вильямс”, 127055, г. Москва, ул. Лесная, д. 43, стр. 1.
Васильев А.Н. Программирование на C++ в примерах и задачах / А.Н. Васильев. - М.: ЭКСМО, 2017. - 416 c.
Книга включает в себя полный набор сведений о языке С++, необходимых для успешного анализа и составления эффективных программных кодов. Отпечатано в ОАО «Можайский полиграфический комбинат» 143200, г. Можайск, ул. Мира, 93.
I. Теоретическая часть
Глава 1. Краткая история языков программирования. Обзор Visual C++
Первые языки программирования были машинными. Каждый центральный процессор (CPU) имел (и до сих пор имеет) фиксированный набор сравнительно простых команд, которые он умеет выполнять, например, сложить или перемножить два числа, скопировать значение из одной ячейки памяти в другую, проверить некоторое условие и в случае его выполнения осуществить переход к определенной инструкции и т.д. Программирование велось в машинных кодах, то есть по сути в числах, так как каждая команда кодировалась с помощью определенной последовательности нулей и единиц. Затем последовало первое «упрощение» языков – вместо чисел появились мнемонические названия команд. Например, для обозначения операции сложения двух чисел использовалась не соответствующая ей числовая комбинация, а слово ADD. Логически программы не стали проще, но теперь хотя бы вместо одной большой последовательности чисел программист видел перед собой набор более-менее читаемых команд. Так появились ассемблерные языки. Они взаимно-однозначно отображались в машинные, не несли в себе принципиально новых идей и по сути служили лишь для удобства работы с машинным языком, так как человекочитаемые названия команд ADD, MUL, SUB, MOV, JMP гораздо проще запомнить, чем их числовые эквиваленты [5, с. 260][2].
Затем задачи, решаемые с помощью компьютеров, еще больше усложнились, программы стали настолько большими и громоздкими, что эффективная работа с ними на ассемблерном уровне была практически невозможной. Начали появляться так называемые языки высокого уровня. Первый из них – Фортран – появился в 1957 году. Этот язык был создан группой программистов под руководством Джона Бэкуса из корпорации IBM. Название Fortran является сокращением от FORmula TRANslator (переводчик формул). Фортран широко используется в первую очередь для научных и инженерных вычислений.
Следующим языком был Лисп - 1958 год - функциональный язык, принципиально отличающийся своей парадигмой от структурированных языков программирования, с которыми мы, в основном, имеем дело сегодня, и к которым, в частности, относится язык Си.
В 1970 году появился Паскаль, ставший на то время одним из наиболее известных языков программирования. Паскаль использовался в основном для обучения программированию в старших классах школы и на первых курсах вузов.
В 1972 году сотрудник компании Bell Labs - Денис Ритчи создал специально для разработки операционной системы UNIX язык Си, поэтому он и по сей день является языком системного программирования.
По мере эволюционного развития всех этих и других языков начали возникать различные парадигмы программирования: структурированное, функциональное, объектно-ориентированное, событийное и т.д.
С 1960 по 1970 были разработаны все основные концепции языков программирования. Каждая новая парадигма все более и более «удаляет» нас от технических аспектов исполнителя и приближает к реальному миру. В идеале, компьютерные программы должны быть неотличимы от текстов на естественном языке. Примеры того, как это могло бы выглядеть на практике, мы уже видели в научно-фантастических фильмах [7, с.52][3]. Собственно, искусственный интеллект, изображаемый в подобных художественных фильмах, это и есть образ идеального интерпретатора естественного языка. Мы просто описываем компьютеру нашу задачу на русском (английском или любом другом) языке, и он ее решает для нас.
Для реализации материала для изучения была выбрана система программирования Visual Studio 2017, так как она предоставляет наиболее широкие возможности для программирования приложений ОС Windows.
Visual C++ – это продукт Microsoft для быстрого создания приложений. Высокопроизводительный инструмент визуального построения приложений включает в себя настоящий компилятор кода и предоставляет средства визуального программирования, несколько похожие на те, что можно обнаружить в Microsoft Visual Basic, или в других инструментах визуального проектирования [2, с.87][4].
Visual C++ производит небольшие по размерам (до 15-30 Кбайт) высокоэффективные исполняемые модули (.exe и .dll). С другой стороны, небольшие по размерам и быстро исполняемые модули означают, что требования к клиентским рабочим местам существенно снижаются – это имеет немаловажное значение и для конечных пользователей.
Преимущества Visual C++ по сравнению с аналогичными программными продуктами.
- быстрота разработки приложения;
- высокая производительность разработанного приложения;
- низкие требования разработанного приложения к ресурсам компьютера;
- наращиваемость за счет встраивания новых компонентов и инструментов в среду Visual C++;
- возможность разработки новых компонентов и инструментов собственными средствами Visual C++ (существующие компоненты и инструменты доступны в исходных кодах);
- удачная проработка иерархии объектов.
Система программирования Visual C++ рассчитана на программирование различных приложений и предоставляет большое количество компонентов для этого [6, с.121][5].
Глава 2. Основы файлового ввода-вывода. Чтение из файла
Файлы - источник жизни компьютера. Без них все результаты работы уничтожались бы при перезагрузке компьютера или закрытии приложения. Язык C++ позволяет выполнять чтение и запись в файлы. Операции над файлами называются файловым вводом-выводом [15, с.56][6].
Операции чтения и записи в файлы очень похожи на использование объектов cout и cin, однако cin и cout являются глобальными переменными, а для чтения и записи в файлы необходимо объявлять собственные объекты. Это означает, что необходимо знать фактические типы данных.
Двумя такими типами являются входящий файловый поток и исходящий файловый поток. Поток представляет собой набор данных, доступных для чтения и записи. Принцип действия этих типов в том, что они преобразуют файл в длинный поток данных, которые можно использовать так, как будто взаимодействуете с пользователем. Оба типа требуют включения в программу заголовочного файла fstream (сокращение от file stream - файловый поток) [3, с.236][7].
Рассмотрим считывание данных из файлов. Для этого воспользуемся типом ifstream. Экземпляр ifstream можно инициализировать по имени файла, из которого мы хотим считать данные:
int main ()
{
ifstream file_reader("myfile.txt");
}
Эта небольшая программа пытается открыть файл myfile.txt: она ищет его в том каталоге, где выполняется (это рабочий каталог программы). При необходимости можно указать полный путь к файлу, например с:\myfile.txt.
Нужно обратить внимание, что программа лишь делает попытку открыть файл: возможно, этот файл не существует. Можно проверить результат создания объекта ifstream и определить, был ли файл успешно открыт, с помощью метода is_open: [9, с.401][8].
int main ()
{
ifstream file_reader("myfile.txt");
if (! file_reader.is_open())
{
cout << "Could not open file!" << ‘\n’;
}
}
При работе с файлами нужно писать код, который обрабатывает возможные ошибки. Возможно, файлы не существуют, они могут быть повреждены или использоваться другим процессом системы. Во всех этих случаях операции над файлами завершаются неудачно.
Нужно быть готовым к разнообразным ошибкам, вызывающим проблемы при работе с файлом, таким как сбои диска, повреждения файлов, отключение питания, некорректные секторы диска и др. [10, с.463][9].
После открытия файла объект ifstream можно использовать так же, как cin. Следующий код считывает число из текстового файла:
int main ()
{
ifstream file_reader("myfile.txt");
if (! file_reader.is_open())
{
cout << "Could not open file!" << ‘\n’;
}
int number;
file_reader >> number;
}
Эта строка считывает цифры из файла так же, как если бы их вводил пользователь. Считывание продолжается до обнаружения пробела или другого разделителя. Например, если файл содержит текст
12 а b с
то после операции считывания значение переменной number становится равным 12.
При работе с файлами необходимо определять, не произошла ли ошибка. В C++ это можно сделать по значению, которое возвращает операция чтения:
int main ()
{
ifstream file_reader("myfile.txt");
if (! file_reader.is_open())
{
cout << "Could not open file!" << ‘\n’;
}
int number;
// здесь проверяем успешность считывания целого значения if (file_reader >> number)
{
cout << "The value is: " << number;
}
}
Проверяя результат вызова file_reader >> number, можно обнаруживать проблемы, связанные с дисковым накопителем и форматом считываемых данных. Необходимо помнить, что пользователь может ввести символ, там, где нужно ввести число. Данный метод позволяет защититься от подобных неприятностей [10, с.485][10]. Проверяем значение, возвращаемое функцией чтения: если оно истинно, операция прошла успешно и можно уверенно пользоваться данными; если ложно что-то пошло не так и это следует трактовать, как ошибку.
Глава 3. Форматы файлов
Запрашивая данные у пользователя, можно указать ему, какие значения хотим получить, и, если вводимые данные некорректны, инструктировать его, как их исправить. При считывании из файлов такой возможности нет. Файлы создаются заранее - возможно, еще до того, как была написана программа. Чтобы считать данные, нужно знать формат файла [8, с.142][11]. Формат файла представляет собой его структуру (необязательно сложную). Допустим, есть таблица рекордов, которую необходимо сохранять между запусками программы. Пример простого формата файла - это десять строк, каждая из которых содержит одно число:
1000
987
864
766
744
500
453
321
201
98
5
Ниже приведем пример кода, который считывает данный список:
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
int main ()
{
ifstream file_reader("highscores.txt");
if (! file_reader.is_open())
{
cout << “Could not open file!" << '\n';
}
vector<int> scores;
for (int i = 0; i < 10; i++)
{
int score;
file_reader >> score;
scores.push_back(score);
}
}
В этом коде нет ничего сложного: он просто открывает файл и считывает рекорды по одному за раз. Этот код даже не полагается на то, что рекорды разделены символами новой строки, - он работает с пробелами. Тем не менее это недостаток реализации, а не особенность формата файла. Другие программы, работающие с файлами такого формата, могут оказаться требовательнее к данным, которые считывают. Существует хороший принцип работы с форматами файлов, называемый законом Постела: «Будьте либеральны к данным, которые принимаете, и консервативны к данным, которые отправляете». Другими словами, код, создающий файл, должен очень тщательно следовать спецификации, а код, считывающий формат файла, должен быть терпимым к небольшим ошибкам программ, написанных не столь безупречно. В приведенном выше примере мы проявляем либеральность, принимая не только символы новой строки, но и пробелы.
Конец файла.
Этот код работает лишь с конкретным файловым форматом и не предусматривает никакой обработки ошибок. Например, если количество записей в файле меньше десяти, код не прекратит считывание, даже достигнув конца файла [12, с.198][12]. Ситуация, когда количество рекордов меньше десяти, вполне возможна - например, если в игру играли лишь дважды. Конец файла часто обозначается аббревиатурой EOF (end of file, конец файла).