在 C++ 中仅使用 "char" 比较两个输入文件
Comparing two input files using only "char" in c++
我正在寻求有关作业问题的帮助,或者更多的只是朝着正确方向的推动。我们不允许使用字符串。我们确实需要使用eof。
问题:
评估多项选择题考试需要两个数据文件。第一个文件
(booklet.dat) 包含正确答案。问题总数为 50。 A
示例文件如下:
ACBAADDBCBDDAACDBACABDCABCCBDDABCACABABABCBDBABD
第二个文件 (answer.dat) 包含学生的答案。每行有一个
包含以下信息的学生记录:
学生的答案(共50个答案):每个答案可以是A、B、C、D
或 *(表示没有回答)。
答案之间没有空格。
学生卡
学生姓名
示例文件如下:
AACCBDBCDBCBDAAABDBCBDBAABCBDDBABDBCDAABDCBDBDA 6555 MAHMUT
CBBDBCBDBDBDBBABABABBBBBABBABBBBBDBBBCBBDBABBBDC** 6448 思南
ACBADDBCBDDAACDBACABDCABCCBDDABCACABABABCBDBABD 6559 CAGIL
编写一个C++程序,计算每个学生的正确答案总数
并将此信息输出到另一个名为 report.dat.
的文件
对于上面给出的示例文件,输出应如下所示:
6555 MAHMUT 10
6448思南12
6550 卡吉尔 49
请参阅下面的问题和我的代码。我认为最好将学生的答案放入二维数组中,但每次我尝试这样做时,我都没有得到正确的输出。任何帮助将不胜感激。
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
int main(){
char answerKey[50];
char studentDetails;
char studentAnswers[3][50];
char next;
ifstream memo, answers;
memo.open("booklet.dat");
if (memo.fail()){
cout << "booklet.dat failed to open. \n";
exit(1);
}
answers.open("answer.dat");
if (memo.fail()){
cout << "answer.dat failed to open. \n";
exit(1);
}
for (int i = 0; i < 50; i++){
memo >> next;
answerKey[i] = next;
}
for (int i = 0; (next != '\n'); i++){
for (int j = 0; j < 50; j++){
answers >> next;
studentAnswers[i][j] = next;
}
}
return 0;
}
我不太明白为什么要将答案存储在数组中。你能不能只做这样的事情:
while( fileHasNotEnded )
{
answers >> answerOfStudent;
memo >> correctAnswer;
if( AnswerOfStudent == correctAnswer )
correctAnswerCounter++;
}
这是实现您目标的一种方法,还有许多其他方法。
const unsigned int MAX_ANSWERS = 50U;
char answer_key[MAX_ANSWERS] = {0};
// Read in the answer key.
std::ifstream answer_file("booklet.dat");
answer_file.read(&answer_key[0], MAX_ANSWERS);
// Process the students answers
char student_answers[MAX_ANSWERS] = {0};
std::ifstream student_file("answer.dat");
while (student_file.read(&student_answers[0], MAX_ANSWERS))
{
correct_answers = 0;
for (unsigned int i = 0; i < [MAX_ANSWERS]; ++i)
{
if (student_answers[i] == answer_key[i])
{
++correct_answers;
}
}
// Output the remainder of the line.
char c;
while (student_file >> c)
{
if (c == '\r') continue; // Don't print the CR
if (c == '\n')
{
cout << correct_answers;
cout << endl;
student_file.ignore(10000, '\n');
break;
}
cout << c;
}
}
在上面的代码中,答案键被读取并存储。
对于每个学生行,读入学生的答案,然后与答案键进行比较。内循环计算正确答案的数量。
答案比较后,打印数据行的剩余部分,直到行尾。遇到行尾时,打印正确答案数量。
我正在寻求有关作业问题的帮助,或者更多的只是朝着正确方向的推动。我们不允许使用字符串。我们确实需要使用eof。
问题:
评估多项选择题考试需要两个数据文件。第一个文件 (booklet.dat) 包含正确答案。问题总数为 50。 A 示例文件如下: ACBAADDBCBDDAACDBACABDCABCCBDDABCACABABABCBDBABD
第二个文件 (answer.dat) 包含学生的答案。每行有一个 包含以下信息的学生记录: 学生的答案(共50个答案):每个答案可以是A、B、C、D 或 *(表示没有回答)。
答案之间没有空格。 学生卡 学生姓名 示例文件如下: AACCBDBCDBCBDAAABDBCBDBAABCBDDBABDBCDAABDCBDBDA 6555 MAHMUT CBBDBCBDBDBDBBABABABBBBBABBABBBBBDBBBCBBDBABBBDC** 6448 思南 ACBADDBCBDDAACDBACABDCABCCBDDABCACABABABCBDBABD 6559 CAGIL
编写一个C++程序,计算每个学生的正确答案总数 并将此信息输出到另一个名为 report.dat.
的文件对于上面给出的示例文件,输出应如下所示:
6555 MAHMUT 10
6448思南12
6550 卡吉尔 49
请参阅下面的问题和我的代码。我认为最好将学生的答案放入二维数组中,但每次我尝试这样做时,我都没有得到正确的输出。任何帮助将不胜感激。
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
int main(){
char answerKey[50];
char studentDetails;
char studentAnswers[3][50];
char next;
ifstream memo, answers;
memo.open("booklet.dat");
if (memo.fail()){
cout << "booklet.dat failed to open. \n";
exit(1);
}
answers.open("answer.dat");
if (memo.fail()){
cout << "answer.dat failed to open. \n";
exit(1);
}
for (int i = 0; i < 50; i++){
memo >> next;
answerKey[i] = next;
}
for (int i = 0; (next != '\n'); i++){
for (int j = 0; j < 50; j++){
answers >> next;
studentAnswers[i][j] = next;
}
}
return 0;
}
我不太明白为什么要将答案存储在数组中。你能不能只做这样的事情:
while( fileHasNotEnded )
{
answers >> answerOfStudent;
memo >> correctAnswer;
if( AnswerOfStudent == correctAnswer )
correctAnswerCounter++;
}
这是实现您目标的一种方法,还有许多其他方法。
const unsigned int MAX_ANSWERS = 50U;
char answer_key[MAX_ANSWERS] = {0};
// Read in the answer key.
std::ifstream answer_file("booklet.dat");
answer_file.read(&answer_key[0], MAX_ANSWERS);
// Process the students answers
char student_answers[MAX_ANSWERS] = {0};
std::ifstream student_file("answer.dat");
while (student_file.read(&student_answers[0], MAX_ANSWERS))
{
correct_answers = 0;
for (unsigned int i = 0; i < [MAX_ANSWERS]; ++i)
{
if (student_answers[i] == answer_key[i])
{
++correct_answers;
}
}
// Output the remainder of the line.
char c;
while (student_file >> c)
{
if (c == '\r') continue; // Don't print the CR
if (c == '\n')
{
cout << correct_answers;
cout << endl;
student_file.ignore(10000, '\n');
break;
}
cout << c;
}
}
在上面的代码中,答案键被读取并存储。
对于每个学生行,读入学生的答案,然后与答案键进行比较。内循环计算正确答案的数量。
答案比较后,打印数据行的剩余部分,直到行尾。遇到行尾时,打印正确答案数量。