Member 13068214 Ответов: 1

Как читать int и char из файла в массив


Файл имеет такие значения
BECDCBAADEBACBAEDDBEDCBAAECDCB
1234 BECDXACDXAXDXEDBXCABCDEXX

Первая строка-это правильные ответы, которые должны быть сравнены с ответами во второй (имеет только одну строку из-за причин тестирования), а целое число-это идентификатор.

Что я уже пробовал:

#include <iostream>
#include <fstream>
using namespace std;
int main(){
    char right[30],r;
    char n=0,m=0;
    char answers[30],a;
    int id[30],i=0;


    ifstream infile;
    infile.open("exam.txt");

    ofstream outfile;
    outfile.open("report.txt");

    if (!infile.is_open())
        cout<<"Error opening file. Aborting....";

    if (!outfile.is_open())
        cout<<"Error opening file. Aborting....";



    infile>>r;
    while (!infile.eof()&& n<30 && i<30){
        right [n] = r;
        infile>>id[i];
        cout<<right [n];
        cout<<id[i];
        n++;
        m++;
    }

Richard Andrew x64

Это почти хороший вопрос, потому что он содержит проблему и то, что было опробовано. Но в нем отсутствует важнейшая составляющая того, в чем именно заключается вопрос. Что он должен делать, и что он делает неправильно?

Member 13068214

О вот и вся штука

Экзамен с множественным выбором состоит из тридцати вопросов. Каждый вопрос имеет пять вариантов, обозначенных как A, B, C, D и E. Первая строка данных содержит правильные ответы на тридцать вопросов в первых 30 позициях символов, например:

BECDCBAADEBACBAEDDBEDCBAAECDCB

Каждая последующая строка содержит ответы для кандидата. Данные в строке состоят из числа кандидата (целого числа), за которым следует один или несколько пробелов, а затем тридцать ответов, данных кандидатом в следующих тридцати последовательных позициях символов. X используется, если кандидат не ответил на частичный вопрос. Вы можете предположить что за номером кандидата следует 30 действительных ответов примерная строка выглядит следующим образом:

1234 BECDXACDXAXDXEDBXCABCDEXX

Есть неизвестное количество кандидатов. Строка, содержащая номер кандидата 0, указывает только на конец данных.


Member 13068214

Дело в том, что я пытаюсь прочитать правильные ответы на массив, но получаю ошибку, когда добираюсь до следующей строки с целыми числами, и я также читаю пустые места, когда я должен игнорировать их.

Richard MacCutchan

Было бы гораздо проще просто прочитать каждую строку в массиве за один раз, используя getline().

Member 13068214

Я не могу использовать getline (). Я провожу курс программирования для начинающих

Richard MacCutchan

Затем вам нужно найти какой-то способ узнать, когда вы достигли конца каждой строки, и перейти к следующей. То, что вы закодировали выше, похоже, не делает того, что вы хотите. В общем, всегда лучше сначала попытаться прочитать и проанализировать ваши входные данные и сохранить их в некоторых контейнерах в вашем коде. После того, как вы захватили информацию, вы можете обработать ее любым необходимым способом, прежде чем записывать свои результаты.

1 Ответов

Рейтинг:
1

RAMASWAMY EKAMBARAM

Следующая программа (на языке C, а не C++) читает одиночные символы - я надеюсь, что вы сможете преобразовать их в C++. Это довольно долго, но версия C++ (со всеми встроенными классами и методами) может быть короче.

#include <stdio.h>
#include <ctype.h>

#define CR				13
#define LF				10
#define NUMQUESTIONS	30

typedef struct
{
	char standard[NUMQUESTIONS];
	int candidatenum;
	char ans[NUMQUESTIONS * 2 + 1];
	char eval[NUMQUESTIONS * 7 + 15];
}
EXAM, *PEXAM;

int readstandard(PEXAM pex, FILE *fp);
int processpaper(PEXAM pex, FILE *fp);

char *infile = "exam.txt", *outfile = "report.txt";


void main()
{
	FILE *fpin, *fpout;
	static EXAM ex;
	
	fpin = fopen(infile, "rb");
	fpout = fopen(outfile, "w");
	
	if(fpin == NULL || fpout == NULL)
	{
		goto eofunction;
	}
	
	readstandard(&ex, fpin);
	while(processpaper(&ex, fpin))
	{
		fprintf(fpout, "Candidate: %d\nAnswers: %s\nEvaluation: %s\n\n", ex.candidatenum, ex.ans, ex.eval);
	}
	
	eofunction:
	if(fpin == NULL)
	{
		printf("Could not open input file: %s\n", infile);
	}
	else
	{
		fclose(fpin);
	}

	if(fpout == NULL)
	{
		printf("Could not open output file: %s\n", outfile);
	}
	else
	{
		fclose(fpout);
	}
	
}

int readstandard(PEXAM pex, FILE *fp)
{
	char c;
	int i = 0;
	
	do
	{
		fread(&c, 1, 1, fp);
		if(i < NUMQUESTIONS && isupper(c))
		{
			pex->standard[i++] = c;
		}
	}
	while(c != LF);  
	
	return i;
}

int processpaper(PEXAM pex, FILE *fp)
{
	char c = 0;
	int i = 0, written = 0, tot = 0, score;
	
	pex->candidatenum = 0;
	do
	{
		if(fread(&c, 1, 1, fp) > 0)
		{
			if(isdigit(c))
			{
				pex->candidatenum = pex->candidatenum * 10 + (c - '0');
			}
			
			if(i < NUMQUESTIONS && isupper(c))
			{
				sprintf(pex->ans + i * 2, "%c ", c);
				tot += score = c == 'X' ? 0 : (c == pex->standard[i] ? 2 : -1);
				written += sprintf(pex -> eval + written, "%d. %d ", i + 1, score);
				i++;
			}
		}
	}
	while(c != LF && c);  
	if(i)
	{
		sprintf(pex -> eval + written, "Total: %d", tot);
	}
	
	return i;
}


Пример входного файла:
Цитата:
BECDCBAADEBACBAEDDBEDCBAAECDCB
1234 BEABCDXACDXAXDXEDBXCAXEBDXDEXX
117 ACBEXXXACDXAXDXEDBXCABCXBAEDDE
23456 BECDXACDXBEDCBAAEAXDXEDBXCABCX


Member 13068214

Извини но я никогда не понимал с