Файл: Работа с текстовыми файлами.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 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++ с текстовыми файлами. В данной программе реализовано: создание текстового файла, заполнение данными, чтение из файла, поиск и замена данных в файле.

Заключение

В ходе выполнения курсовой работы выполнены следующие задачи:

  1. Выполнен краткий обзор истории языков программирования.
  2. Произведен обзор возможностей Visual C++.
  3. Рассмотрены механизмы Visual C++ для работы с текстовыми файлами.
  4. Реализовано приложение, демонстрирующее механизмы языка C++ для работы с текстовыми файлами.

Созданное приложение, демонстрирующее механизмы языка C++ для работы с текстовыми файлами протестировано, и показало хорошие результаты.

Библиография

  1. Альфред В. Компиляторы. Принципы, технологии и инструментарий / В Альфред. – М.: Высшая школа, 2015. - 882 c.
  2. Страуструп Бьерн. Программирование: принципы и практика с использованием C++ / Бьерн Страуструп. - М.: Вильямс, 2016. - 1328 c.
  3. Васильев А.Н. Программирование на C++ в примерах и задачах / А.Н. Васильев. - М.: ЭКСМО, 2017. - 416 c.
  4. Довбуш Г.Ф. Visual C++ на примерах / Г.Ф. Довбуш, А.Д. Хомоненко. - М.: БХВ-Петербург, 2012. - 528 c.
  5. Карпов Б. C++: специальный справочник / Б. Карпов, Т. Баранова. - М.: СПб: Питер, 2016. - 480 c.
  6. Кениг Э. Эффективное программирование на C++. Практическое программирование на примерах. Т. 2 / Э. Кениг, Б.Э. Му. - М.: Вильямс, 2016. – 368 c.
  7. Панюкова Т.А. Языки и методы программирования. Создание простых GUI-приложений с помощью Visual С++. Учебное пособие / Т.А. Панюкова, А.В. Панюков. - Москва: Мир, 2015. - 144 c.
  8. Пахомов Борис С/С++ и MS Visual C++ 2012 для начинающих / Борис Пахомов. - М.: БХВ-Петербург, 2015. - 463 c.
  9. Полубенцева М.И. C/C++. Процедурное программирование / М.И. Полубенцева. - СПб: BHV, 2008. - 448 c.
  10. Секунов Н.Ю. Самоучитель Visual C++ 6.0 / Н.Ю. Секунов. - М.: СПб: BHV, 2014. - 960 c.
  11. Страуструп Бьерн. Дизайн и эволюция С++ / Бьерн Страуструп. - М.: ДМК Пресс, 2016. - 446 c.
  12. Фленов М.Е. Программирование на C++ глазами хакера. / М.Е. Фленов. - СПб: BHV, 2012. - 352 c.
  13. Хенкеманс Д. Программирование на C++ / Д. Хенкеманс, М. Ли. - СПб: Символ-плюс, 2015. - 416 c.
  14. Хусаинов И.Г. Решение задач на ЭВМ. Структурное программирование - Стерлитамак: БашГУ, 2014 - 110 с.
  15. Чиртик А.А. Программирование на 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);

// Записывая данные не в начало файла,

// мы должны указать символ новой строки; поскольку

// считывание числа заканчивается на первом разделителе,

// перед записью мы находимся в конце числа,

// а не в начале новой строки