Добавлен: 25.05.2023
Просмотров: 268
Скачиваний: 3
}
// сохраняем данные в вектор
vector<int> scores;
for (int i = 0; i < 15; i++)
{
int score;
if (!(file_reader >> score))
{
break;
}
scores.push_back(score);
}
Рисунок 5 – Чтение из файла и заполнение вектора
Для проверки промежуточного результата, выполним сборку проекта (рис. 6) и выполним скомпилированный файл (рис. 7).
Рисунок 6 – Результат сборки
Рисунок 7 – Результат выполнения
Далее реализуем поиск и замену в файле рекордов «scores.txt» (рис. 8).
Листинг 3 – Код поиска и замены рекорда
// поиск и замена в файле
fstream file(
"scores.txt",
ios::in | ios::out
);
if (!file.is_open())
{
cout << "Could not open file!" << '\n';
return 0;
}
int new_high_score;
cout << "Enter a new high score: ";
cin >> new_high_score;
// Приведенный ниже цикл while выполняет поиск в файле,
// пока не найдет значение, меньшее
// текущего рекорда; после этого нужно вставить
// рекорд перед найденным значением.
// Чтобы определить требуемую позицию, мы следим
// за позицией, предшествующей текущему рекорду, -
// pre_score_pos
streampos pre_score_pos = file.tellg();
int cur_score;
while (file >> cur_score)
{
if (cur_score < new_high_score)
{
break;
}
pre_score_pos = file.tellg();
}
// если fail возвращает true и мы не находимся в конце файла,
// ввод некорректен
if (file.fail() && !file.eof())
{
cout << "Bad score / read--exiting";
return 0;
}
// если мы достигли конца файла, то
// не сможем вести запись в файл, не вызвав clear
file.clear();
// Возврат к точке перед последним считанным рекордом,
// чтобы считать все рекорды, меньшие нового,
// и сдвинуть их в файле на одну позицию
file.seekg(pre_score_pos);
// Теперь мы считаем все рекорды, начиная
// со считанного ранее
vector<int> scores;
while (file >> cur_score)
{
scores.push_back(cur_score);
}
// Этот цикл чтения должен выполняться до конца файла,
// поскольку мы хотим считать все рекорды,
// которые в нем хранятся
if (! file.eof())
{
cout << "Bad score/read--exiting";
return 0;
}
// Поскольку достигнут конец файла, нужно снова вызвать метод
// clear, чтобы продолжить запись в файл
file.clear();
// Возврат на позицию вставки
file.seekp(pre_score_pos);
// Записывая данные не в начало файла,
// мы должны указать символ новой строки; поскольку
// считывание числа заканчивается на первом разделителе,
// перед записью мы находимся в конце числа,
// а не в начале новой строки
if (pre_score_pos != std::streampos(0))
{
file << endl;
}
// запись нового рекорда
file << new_high_score << endl;
// циклическая запись всех оставшихся рекордов
for (vector<int>::iterator itr = scores.begin();
itr != scores.end();
++itr)
{
file << *itr << endl;
}
Рисунок 8 – Поиск и замена в файле
Собираем проект (рис. 9) и запускаем на выполнение (рис. 10).
Рисунок 9 – Сборка проекта
Рисунок 10 – Ввод нового рекорда
Для тестирование вводим значение 20.
Рисунок 11 – Результат работы программы
Таким образом, в данном разделе мы создали приложение, демонстрирующее работу языка программирования C++ с текстовыми файлами. В данной программе реализовано: создание текстового файла, заполнение данными, чтение из файла, поиск и замена данных в файле.
Заключение
В ходе выполнения курсовой работы выполнены следующие задачи:
- Выполнен краткий обзор истории языков программирования.
- Произведен обзор возможностей Visual C++.
- Рассмотрены механизмы Visual C++ для работы с текстовыми файлами.
- Реализовано приложение, демонстрирующее механизмы языка C++ для работы с текстовыми файлами.
Созданное приложение, демонстрирующее механизмы языка C++ для работы с текстовыми файлами протестировано, и показало хорошие результаты.
Библиография
- Альфред В. Компиляторы. Принципы, технологии и инструментарий / В Альфред. – М.: Высшая школа, 2015. - 882 c.
- Страуструп Бьерн. Программирование: принципы и практика с использованием C++ / Бьерн Страуструп. - М.: Вильямс, 2016. - 1328 c.
- Васильев А.Н. Программирование на C++ в примерах и задачах / А.Н. Васильев. - М.: ЭКСМО, 2017. - 416 c.
- Довбуш Г.Ф. Visual C++ на примерах / Г.Ф. Довбуш, А.Д. Хомоненко. - М.: БХВ-Петербург, 2012. - 528 c.
- Карпов Б. C++: специальный справочник / Б. Карпов, Т. Баранова. - М.: СПб: Питер, 2016. - 480 c.
- Кениг Э. Эффективное программирование на C++. Практическое программирование на примерах. Т. 2 / Э. Кениг, Б.Э. Му. - М.: Вильямс, 2016. – 368 c.
- Панюкова Т.А. Языки и методы программирования. Создание простых GUI-приложений с помощью Visual С++. Учебное пособие / Т.А. Панюкова, А.В. Панюков. - Москва: Мир, 2015. - 144 c.
- Пахомов Борис С/С++ и MS Visual C++ 2012 для начинающих / Борис Пахомов. - М.: БХВ-Петербург, 2015. - 463 c.
- Полубенцева М.И. C/C++. Процедурное программирование / М.И. Полубенцева. - СПб: BHV, 2008. - 448 c.
- Секунов Н.Ю. Самоучитель Visual C++ 6.0 / Н.Ю. Секунов. - М.: СПб: BHV, 2014. - 960 c.
- Страуструп Бьерн. Дизайн и эволюция С++ / Бьерн Страуструп. - М.: ДМК Пресс, 2016. - 446 c.
- Фленов М.Е. Программирование на C++ глазами хакера. / М.Е. Фленов. - СПб: BHV, 2012. - 352 c.
- Хенкеманс Д. Программирование на C++ / Д. Хенкеманс, М. Ли. - СПб: Символ-плюс, 2015. - 416 c.
- Хусаинов И.Г. Решение задач на ЭВМ. Структурное программирование - Стерлитамак: БашГУ, 2014 - 110 с.
- Чиртик А.А. Программирование на C++. Трюки и эффекты. / А.А. Чиртик. - СПб: Питер, 2011. - 96 c.
Приложения
Приложение А. Исходный код программы
#include "pch.h"
#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>
using namespace std;
int main()
{
// создаем файл и записываем в него данные от 1 до 15
ofstream file_writer("scores.txt");
if (!file_writer.is_open())
{
cout << "Could not open file!" << '\n';
return 0;
}
for (int i = 0; i < 15; i++)
{
file_writer << 15 - i << '\n';
}
// чтение данных из файла
ifstream file_reader("scores.txt");
if (!file_reader.is_open())
{
cout << "Could not open file!" << '\n';
}
// сохраняем данные в вектор
vector<int> scores;
for (int i = 0; i < 15; i++)
{
int score;
if (!(file_reader >> score))
{
break;
}
scores.push_back(score);
}
// поиск и замена в файле
fstream file(
"scores.txt",
ios::in | ios::out
);
if (!file.is_open())
{
cout << "Could not open file!" << '\n';
return 0;
}
int new_high_score;
cout << "Enter a new high score: ";
cin >> new_high_score;
// Приведенный ниже цикл while выполняет поиск в файле,
// пока не найдет значение, меньшее
// текущего рекорда; после этого нужно вставить
// рекорд перед найденным значением.
// Чтобы определить требуемую позицию, мы следим
// за позицией, предшествующей текущему рекорду, -
// pre_score_pos
streampos pre_score_pos = file.tellg();
int cur_score;
while (file >> cur_score)
{
if (cur_score < new_high_score)
{
break;
}
pre_score_pos = file.tellg();
}
// если fail возвращает true и мы не находимся в конце файла,
// ввод некорректен
if (file.fail() && !file.eof())
{
cout << "Bad score / read--exiting";
return 0;
}
// если мы достигли конца файла, то
// не сможем вести запись в файл, не вызвав clear
file.clear();
// Возврат к точке перед последним считанным рекордом,
// чтобы считать все рекорды, меньшие нового,
// и сдвинуть их в файле на одну позицию
file.seekg(pre_score_pos);
// Теперь мы считаем все рекорды, начиная
// со считанного ранее vector<int> scores;
while (file >> cur_score)
{
scores.push_back(cur_score);
}
// Этот цикл чтения должен выполняться до конца файла,
// поскольку мы хотим считать все рекорды,
// которые в нем хранятся
if (! file.eof())
{
cout << "Bad score/read--exiting";
return 0;
}
// Поскольку достигнут конец файла, нужно снова вызвать метод
// clear, чтобы продолжить запись в файл
file.clear();
// Возврат на позицию вставки
file.seekp(pre_score_pos);
// Записывая данные не в начало файла,
// мы должны указать символ новой строки; поскольку
// считывание числа заканчивается на первом разделителе,
// перед записью мы находимся в конце числа,
// а не в начале новой строки