在二进制文件C中查找最常见的字符串

时间:2014-05-28 21:09:49

标签: c arrays string binary

此程序的目的是询问用户输入将在二进制文件中输入多少次考试。当我们获得用户输入时,例如5,do while循环要求输入考试的课程名称和收到的成绩。这将被写入exams.bin并打开以供阅读并找到用户输入的关键字的出现,该关键字应该计算等级平均值。它找到该特定课程的成绩,将它们相加并将它们与参加考试的学生数量(课程名称的重复次数)分开。然后打印出一个浮子。这一切都在下面的代码中工作:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char courseName[30];
    int grade;
} exam;

int main()
{
    exam firstExam, secondExam;
    int examNumber, i = 1, j = 1, gradeSum = 0, studentNumber = 0, mostFreq = 0;
    float gradeAverage;
    char subjectName[30];
    char mostFrequent[30];
    FILE *pointerBinExam = NULL;
    char fileName[13] = "exams.bin";

    pointerBinExam = fopen(fileName, "w+b");

    if(pointerBinExam == NULL)
    {
        printf("File doesn't exist!");
        exit(EXIT_FAILURE);
    }

    printf("How many exams will you input: ");
    scanf("%d", &examNumber);
    fflush(stdin);

    do{
    printf("\nCourse name: ");
    fgets(firstExam.courseName, 30, stdin);
    printf("\nGrade: ");
    scanf("%d", &firstExam.grade);
    fwrite(&firstExam, sizeof(exam), 1, pointerBinExam);
    fflush(stdin);
    i++;
    }while(i < examNumber+1);

    rewind(pointerBinExam);

    printf("\nInput the name of the course you wish to calculate grade average: ");
    fgets(subjectName, 30, stdin);

    do{
        fread(&secondExam, sizeof(exam), 1, pointerBinExam);

        if (strncmp(subjectName, secondExam.courseName, 30) == 0){
            gradeSum += secondExam.grade;
            studentNumber += 1;
        }

        j++;
    }while(j < examNumber+1);

    gradeAverage = (float)gradeSum/studentNumber;


    printf("\nNumber of students who took the exam: %d\n", studentNumber);
    printf("\nGrade average: %f", gradeAverage);

    studentNumber = 0;

    rewind(pointerBinExam);
    strcpy(mostFrequent, secondExam.courseName);

    rewind(pointerBinExam);

    do{
        fread(&secondExam, sizeof(exam), 1, pointerBinExam);
        if (strncmp(mostFrequent, secondExam.courseName, 30) == 0){
            mostFreq += 1;
            studentNumber += 1;
        }

        j++;
    }while(j < examNumber+1);**

    fclose(pointerBinExam);

    return 0;
}

代码的最后一部分,new do while循环对我的问题不是一个好方法。我的目标是将指针放在二进制文件的开头并再次读取它。它应该在二进制文件中找到最常用的课程名称。我该怎么做呢?是否有一个我不知道的命令,或者是否应该使用2D数组来处理二进制中的字符串。我一无所知,只是开始理解二进制文件,这是我需要练习的测试任务。任何提示都将受到高度赞赏!

1 个答案:

答案 0 :(得分:0)

要找出最常用的课程,如果二进制文件是由exam形式的记录构成的,你需要从头到尾阅读文件,然后为每门课程设置一些计数器。 / p>

这可以通过多种方式完成,例如:将每个课程名称编码为一个唯一的整数,然后每次在文件中找到相同的课程时计算++ 1,或者您可以找到遇到的课程列表然后搜索列表 - 如果您发现相同的课程添加到计数器或添加新的列表中的节点,计数器= 1