Работа с файлами С++ на примере программы Тест.
В современном мире эффективным способом проверки знаний считается тестирование. Тесты применяются практически во всех сферах: аттестация, образование, сертификация, психология, подбор персонала и т.д. Тестирование позволяет за короткий срок проверить знания человека и оценить его. Чтобы автоматизировать тестирование, разработчики создают специальное программное обеспечение.
Подготовительная работа
Для написания прототипа простого приложения для тестирования на языке программирования С++ мы создадим два текстовых файла.
В файл под именем test.txt запишем вопросы к тесту. Каждый вопрос в файле находится на двух строчках и состоит из вопроса и вариантов ответа.
При сохранении файла, выбираем пункт меню - сохранить как, и устанавливаем кодировку символов ANSI для корректного отображения текста в консоли.
Во втором файле, назовём его answer.txt, в каждой строчке пропишем ответ на вопрос файла test.txt, выполняя заранее установленную последовательность.
При сохранении файла, как и ранее, выбираем пункт меню - сохранить как, и устанавливаем кодировку символов ANSI, для корректного отображения текста в консоли.
Начинаем проектировать
В коде программы используем заголовочные файлы: iostream (обеспечивает ввод - вывод в консоль), fstream (предоставляет интерфейс для чтения или записи данных в файл), string (организовывает работу со строками). Команда using namespace std сообщает компилятору, что мы хотим использовать всё, что находится в пространстве имен std.
Функция void test()
Функция void test() читает из файла test.txt вопросы к тесту и выводит их в консоль. Открывает новый файл myanswer.txt и записывает в него ответы пользователя. По окончанию тестирования закрывает оба файла.
ifstream f, объекты класса ifstream предоставляют возможность для чтения файлов. f.open("test.txt") с помощью данного объекты, используя метод open, открываем файл test.txt.
ofstream out, объекты класса оfstream позволяю нам открывать файлы для записи данных. out.open("myanswer.txt") для открытия файла myanswer.txt используется метод open.
Для работы с прочитанными данными из файла test.txt, используем переменную строкового типа str, ответы пользователя будем сохранять в переменную строкового типа otv.
Каждый вопрос теста нумеруем целочисленной переменной z.
Перед началом работы с данными файлов, проверяем, что все рабочие файлы открылись корректно if (f && out), в ином случаи выводим сообщение об ошибке и покидаем тело функции cout << "Ошибка открытия файла !!!"; return;
При каждой итерации цикла while, с помощью функции getline, читаем построчно данные с файла test.txt. Цикл whele будет работать пока не будут прочитаны все строки файла test.txt.
При каждой итерации цикла while в консоль выводится номер вопроса и запрос на ввод ответа.
После ввода ответа, увеличиваем значение переменной z на единицу и очищаем консоль функцией system("cls").
Записываем ответ объектом out <<otv << "\n"; по аналогии вывода данных в консоль инструкцией cout.
По окончании работы цикла while закрываем текстовые файлы f.close(); out.close();
Функция void result()
Функция result() открывает файлы answer.txt и myanswer.txt, сравнивает ответы пользователя с правильными ответами в файле answer.txt и выводит результат на экран.
В коде функции создаём целочисленные переменные для подсчёта правильных ответов - переменная p и ошибочных переменная n.
Для работы с правильными ответами и ответами пользователя используем строковые переменные str и otv.
С помощью классов ifstream f1("answer.txt"), ifstream f2("myanswer.txt") открываем файлы для чтения. if (f1.is_open() && f2.is_open()) проверяем что все файлы открылись без ошибок, в ином случаи покидаем функцию и сообщаем об ошибке cout << "Ошибка открытия файла !!!"; return;
В параметрах цикла while используя функцию getline читаем правильные ответы и ответы пользователя в строковые переменные str и otv.
В конструкции if (str == otv) сравниваем ответы и если они совпадают, выводим ответ с указанием верно в консоль и увеличиваем значение переменной p на единицу, если это не так, сообщаем, что ответ ошибочный и увеличиваем значение переменной n на единицу.
По окончании работы цикла while незабываем закрыть файлы f1.close(); f2.close();
В конце работы выводим количество правильных и ошибочных ответов и выходим из тела функции.
Функция int main()
В функции main() с помощью функции system("chcp 1251>nul") устанавливаем используемый шрифт - кириллица.
Функция system("color 1f") устанавливает цвет фона синий, а цвет букв ярко белый.
Запускаем выполнение функций test() и result(). Устанавливаем паузу в консоли system("pause"), чтобы она не закрывалась, пока не будет нажата любая клавиша.