Чтение вопросов теста из файла - C (СИ)
Формулировка задачи:
Вот сам код Не хочет работать
// Универсальная программа проверки знаний
#include "stdafx.h"
#include <iostream>
#include <cstddef>
#include <cstring>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
using namespace std;
void main(int argc, char* argv[])
{
char fname[40]; // имя файла теста
FILE* f;// файл теста
f = fopen("fname.txt", "rt");
int VsegoVopr = 0; // количество вопросов теста
int PravOtv = 0; // количество правильных ответов
// для текущего вопроса272 Часть I
int nOtv; // количество альтернативных ответов
int Prav; // номер правильного ответа
int Otv; // номер ответа, выбранного пользователем
int p; // процент правильных ответов
char st[80]; // строка файла теста
int i; // счетчик циклов
if (!argc)
{
puts("\nНе задан файл вопросов теста!");
puts("Командная строка: test ИмяФайлаТеста\n");
return;
}
strcpy_s(fname, argv[1]); // имя файла из командной строки
if (f!=NULL) // Открыть файл в режиме чтения (r) текста (t)
{
printf("Ошибка открытия файла %s", fname);
system("pause");
return;
}
system("cls");
puts("\nСейчас Вам будет предложен тест.");
puts("К каждому вопросу дается несколько вариантов ответа.");
puts("Вы должны ввести номер правильного ответа");
puts("и нажать клавишу <Enter>\n");
printf("Для начала тестирования нажмите <Enter>");
system("pause");
//textbackground(BLUE);
system("cls");
while (!feof(f))
{
VsegoVopr++;
fgets(st, 80, f); // читаем из файла вопрос
printf("\n%s\n", st); // вопрос на экран
fscanf_s(f, "%i %i", &nOtv, &Prav);// кол-во вариантов
// ответа
// и номер прав. ответа
fgets(st, 80, f); // дочитать конец предыдущей строки
//читаем и выводим альтернативные ответы
for (i = 1; i <= nOtv; i++)
{
fgets(st, 80, f);
printf("%i. %s", i, st);
}
printf("\nВаш выбор ->");
scanf_s("%i", &Otv);
if (Otv == Prav) PravOtv++;
}
// обработка результата тестирования
// вычислим процет правильных ответов
p = 100 * PravOtv / VsegoVopr;
printf("\nВаша оценка - ");
if (p == 100) puts("ОТЛИЧНО!");
if (p >= 99 && p <= 80) puts("ХОРОШО.");
if (p >= 60 && p <= 79) puts("УДОВЛЕТВОРИТЕЛЬНО.");
if (p < 60) puts("ПЛОХО!\n");
puts("\nДля завершения нажмите <Enter>");
system("pause");
}
Вот убрал все ошибки, пишет что fopen_s: функция не принимает 2 аргументов
Вот код:
// Универсальная программа проверки знаний
// имя файла теста задается в инструкции запуска программы
#include "stdafx.h"
#include <iostream>
#include <cstddef>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h.>
#include <cstdlib>
using namespace std;
void main(int argc, char* argv[])
{
char fname[40]; // имя файла теста
FILE* f; // файл теста
int VsegoVopr = 0; // количество вопросов теста
int PravOtv = 0; // количество правильных ответов
// для текущего вопроса
int nOtv; // количество альтернативных ответов
int Prav; // номер правильного ответа
int Otv; // номер ответа, выбранного пользователем
int p; // процент правильных ответов
char st[80]; // строка файла теста
int i; // счетчик циклов
if (!argc)
{
puts("\nНе задан файл вопросов теста!");
puts("Командная строка: test ИмяФайлаТеста\n");
return;
}
strcpy_s(fname, argv[1]); // имя файла из командной строки
// Открыть файл в режиме чтения (r) текста (t)
if ((f = fopen_s(fname, "rt")) == NULL)
{
printf("Ошибка открытия файла %s", fname);
_getch();
return;
}
system("cls");
puts("\nСейчас Вам будет предложен тест.");
puts("К каждому вопросу дается несколько вариантов ответа.");
puts("Вы должны ввести номер правильного ответа");
puts("и нажать клавишу <Enter>\n");
printf
("Для начала тестирования нажмите <Enter>");
_getch();
system("cls");;
while (!feof(f))
{
VsegoVopr++;
fgets(st, 80, f); // читаем из файла вопрос
printf("\n%s\n", st); // вопрос на экран
fscanf_s(f, "%i %i", &nOtv, &Prav);// кол-во вариантов
// ответа
// и номер прав. ответа
fgets(st, 80, f); // дочитать конец предыдущей строки
//читаем и выводим альтернативные ответы
for (i = 1; i <= nOtv; i++)
{
fgets(st, 80, f);
printf("%i. %s", i, st);
}
printf("\nВаш выбор ->");
scanf_s("%i", &Otv);
if (Otv == Prav) PravOtv++;
}
// обработка результата тестирования
// вычислим процет правильных ответов
p = 100 * PravOtv / VsegoVopr;
printf("\nВаша оценка - ");
if (p == 100) puts("ОТЛИЧНО!");
if (p >= 99 && p <= 80) puts("ХОРОШО.");
if (p >= 60 && p <= 79) puts("УДОВЛЕТВОРИТЕЛЬНО.");
if (p < 60) puts("ПЛОХО!\n");
puts("\nДля завершения нажмите <Enter>");
_getch();
}Решение задачи: «Чтение вопросов теста из файла»
textual
Листинг программы
// Универсальная программа проверки знаний
// имя файла теста задается в инструкции запуска программы
#include <iostream>
#include <cstddef>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
void main(int argc, char* argv[])
{
char fname[40]; // имя файла теста
FILE* f = NULL; // файл теста
int VsegoVopr = 0; // количество вопросов теста
int PravOtv = 0; // количество правильных ответов
// для текущего вопроса
int nOtv; // количество альтернативных ответов
int Prav; // номер правильного ответа
int Otv; // номер ответа, выбранного пользователем
int p; // процент правильных ответов
char st[80]; // строка файла теста
int i; // счетчик циклов
setlocale(LC_ALL, "Rus");
if (!argc)
{
puts("\nНе задан файл вопросов теста!");
puts("Командная строка: test ИмяФайлаТеста\n");
return;
}
strcpy_s(fname, 40, argv[1]); // имя файла из командной строки
// Открыть файл в режиме чтения (r) текста (t)
if ((f = fopen(fname, "rt")) == NULL)
{
printf("Ошибка открытия файла %s", fname);
_getch();
return;
}
system("cls");
puts("\nСейчас Вам будет предложен тест.");
puts("К каждому вопросу дается несколько вариантов ответа.");
puts("Вы должны ввести номер правильного ответа");
puts("и нажать клавишу <Enter>\n");
printf
("Для начала тестирования нажмите <Enter>");
_getch();
system("cls");;
while (!feof(f))
{
VsegoVopr++;
fgets(st, 80, f); // читаем из файла вопрос
printf("\n%s\n", st); // вопрос на экран
fscanf_s(f, "%i %i", &nOtv, &Prav);// кол-во вариантов
// ответа
// и номер прав. ответа
fgets(st, 80, f); // дочитать конец предыдущей строки
//читаем и выводим альтернативные ответы
for (i = 1; i <= nOtv; i++)
{
fgets(st, 80, f);
printf("%i. %s", i, st);
}
printf("\nВаш выбор ->");
scanf_s("%i", &Otv);
if (Otv == Prav) PravOtv++;
}
// обработка результата тестирования
// вычислим процет правильных ответов
p = 100 * PravOtv / VsegoVopr;
printf("\nВаша оценка - ");
if (p == 100) puts("ОТЛИЧНО!");
if (p >= 99 && p <= 80) puts("ХОРОШО.");
if (p >= 60 && p <= 79) puts("УДОВЛЕТВОРИТЕЛЬНО.");
if (p < 60) puts("ПЛОХО!\n");
puts("\nДля завершения нажмите <Enter>");
_getch();
}
Объяснение кода листинга программы
- В начале кода подключаются необходимые библиотеки: iostream, cstddef, fstream, stdlib.h, printf.h, conio.h, locale.h, string.h.
- Объявлены переменные:
- fname - массив для хранения имени файла теста;
- f - указатель на файл теста;
- VsegoVopr - переменная для хранения общего количества вопросов теста;
- PravOtv - переменная для хранения количества правильных ответов;
- nOtv - переменная для хранения количества альтернативных ответов на текущий вопрос;
- Prav - переменная для хранения номера правильного ответа на текущий вопрос;
- Otv - переменная для хранения номера ответа, выбранного пользователем;
- p - переменная для хранения процента правильных ответов;
- st - массив для хранения строки файла теста;
- i - счетчик циклов.
- При помощи функции strcpy_s() имя файла теста из командной строки копируется в массив fname.
- Если файл теста не удалось открыть, выводится сообщение об ошибке и программа завершается.
- В основной цикл программы while (!feof(f)) происходит чтение вопросов теста из файла и их вывод на экран.
- Функция fscanf_s() используется для чтения из файла количества вариантов ответа и номера правильного ответа.
- Во внутреннем цикле for каждый вариант ответа выводится на экран.
- Пользователь вводит номер выбранного ответа и сохраняет его в переменной Otv.
- Если выбранный ответ совпадает с правильным, переменная PravOtv увеличивается на единицу.
- После окончания внутреннего цикла вычисляется процент правильных ответов и сохраняется в переменной p.
- С помощью условных операторов if-else выводится сообщение с оценкой результата тестирования.
- Для завершения программы пользователю предлагается нажать клавишу
.