C ++ - 文件I / O和Char数组

时间:2012-07-05 01:24:08

标签: c++ io arrays

以下是问题描述:

  

您学校的历史老师需要帮助对真/假测试进行评分。   学生的ID和考试答案存储在一个文件中。第一个条目   文件包含以下形式的测试答案:

     

TFFTFFTTTTFFTFTFTFTT

     

文件中的每个其他条目都是学生ID,后面跟一个空白   根据学生的回答。例如,条目:

     

ABC54301 TFTFTFTT TFTFTFFTTFT

     

表示学生ID为ABC54301,问题1的答案为   没错,问题2的答案是假的,依此类推。这个学生没有   回答问题9.考试有20个问题,班级有以上   150名学生。每个正确答案都会获得两分,每个答案都是错误的   扣除一分,没有答案获得零分。写一个程序   处理测试数据。输出应该是学生的ID,然后是   通过答案,然后是测试分数,然后是测试分数。   假设以下等级等级:90%-100%,A; 80%-89.99%,B;   70%-79.99%,C; 60%-69.99%,D;和0%-59.99%,F。

这是我制作的节目:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
//declaring variables
ifstream file("grading.txt");
char key[21];
char id[9];
char student[21];
int score = 0, i;

//initializing arrays
for(i=0; i<21; i++)
{
    key[i]=0;
    student[i]=0;
}
for(i=0; i<9; i++)
    id[i]=0;

//processing the key
file >> key;
file.ignore(100, "\n");

//processing student grades
while(file.good())
{

    file >> id;
    file.ignore();
    getline(file, student);
    file.ignore(100, "\n");

    //comparing key and student answer
    for(i=0; i<21; i++)
    {
        if(strcmp(student[i], key[i])
            score += 2;
        else
            score -= 1;
    }

    //outputing student id, score and grade
    cout << "Student ID: " << id;
    cout << "Score: " << score;
    score = (score/(40))*100;
    if(score >= 90 && score <= 100)
        cout << "Grade: A" << endl << endl;
    else if(score >= 80 && score <= 89.99)
        cout << "Grade: B" << endl << endl;
    else if(score >= 70 && score <= 79.99)
        cout << "Grade: C" << endl << endl;
    else if(score >= 60 && score <= 69.99)
        cout << "Grade: D" << endl << endl;
    else if(score >= 0 && score <= 59.99)
        cout << "Grade: F" << endl << endl;
    else
        cout << "Invalid percentage" << endl;
}

//closing file
file.close();

return 0;
}

我似乎收到以下编译错误:http://pastebin.com/r0Y1xX8M(无法在此处正确编辑错误,抱歉)

有关编译错误以及有关如何解决此问题的任何其他建议,将不胜感激。

3 个答案:

答案 0 :(得分:2)

您应该使用'\n'作为分隔符 - 字符常量,而不是字符串文字"\n"

分隔符,ignore的第二个参数,类型为int,可以隐式转换字符常量;相反,字符串文字无法转换为int,因此编译器会告诉您。

答案 1 :(得分:0)

始终查找包含源文件和行号的地点。在这种情况下,您可以看到其中的几个:

c:\users\haxtor\desktop\projects\lab 8 part 2 prob 6\lab 8 part 2 prob 6\problem 6.cpp(34)

重要的部分是(34)说第34行有问题。在这种情况下,第34行的问题是学生是char数组而不是字符串而问题是第35行是"\n"应为'\n'。可能会有更多问题。尝试找到提及行号的其他地方并自行修复。

答案 2 :(得分:0)

你的第一个问题是

file.ignore(100, "\n");

我认为您希望'\n'使用单引号而不是双引号。单引号代表一个字符。双引号表示一个或多个字符(字符串)

其次,我相信iostream包含一个string类,它封装了字符数组。我相信getline使用该字符串类。对于使用字符数组,我的个人偏好是fscanf,但是大多数代码似乎都是基于iostream,因此将字符数组更改为字符串可能是最简单的更改。

另外,您的if(strcmp(student[i], key[i])行传入的是字符而不是字符数组。我相信if(student[i] == key[i])是您想要做的。

您的编译错误会告诉您错误所在的代码行,因此对于其余的代码,您可以查看代码并自己思考问题。