C语言中结构的阅读与写作

时间:2014-03-05 10:05:24

标签: c structure

我正在尝试制作一个程序,让用户可以添加,编辑,查看,加载和保存课程,并计算他们的GWA(通用加权平均值)。唯一不起作用的功能是加载/阅读课程!

所以这是我的结构:

struct studrec{     
    char crsnum[MAX_CNUM];
    char crstle[MAX_CTITLE];
    float grdobt;
    float crscrd;
};

这是我的功能:

int loadCourses( struct studrec s[MAX_COURSES], int n ){

    FILE *fp=fopen("savedinputs.txt","r");
    int i;

    if(fp != NULL){
        fscanf(fp, "%d\n", &n);
        for(i=0; i<n; i++){
            fscanf(fp, "%s \n", s[i].crsnum);
            fscanf(fp, "%s \n", s[i].crstle);
            fscanf(fp, "%f \n", &s[i].grdobt);
            fscanf(fp, "%f \n", &s[i].crscrd);
        }
        printf("Loaded!");
        fclose(fp);

    }
    else{
        printf("Error reading file");
    } 

    return n;
}

我不知道为什么会导致SEGMENTATION FAULT。

这就是我称之为负载课程的方式

main() {
//something working here

do{
    ch = dispMenu(ch);

    switch(ch){
        case 1: cnt = addCourse( crs  , cnt );
                break;
        case 2: editCourse( crs );
                break;
        case 3: searchCourse( crs );
                break;
        case 4: dispAllCourses( crs , cnt );
                break;
        case 5: computeGWA( crs );
                break;
        case 6: sortCourses( crs , cnt );
                break;
        case 7: cnt = loadCourses( crs , cnt ); //function call
                break;
        case 8: saveCourses( crs , cnt );
                break;
        case 0: printf("\n\tBye!\n");
                break;
        default: printf("\n\tInvalid Input!\n");
    }
}while(ch!=0);

}

输入都是正确的(例如在MAXCOURSES下)

我移动了fclose(fp),但我不得不说s [i] .crstle是一个带空格的字符串。我该怎么称呼他们?

2 个答案:

答案 0 :(得分:2)

fclose(NULL)free(NULL)不同:只有后者被指定为“什么都不做”。

fclose(NULL)是未定义的行为,并且将明确地崩溃Microsoft的C标准库的实现。因此,您应该将fclose(fp);电话移到 if区块内。

答案 1 :(得分:0)

这是因为用户可以定义高于可用结构数的记录数。

 struct studrec s[MAX_COURSES] //the struct defined

所以你必须检查一下是否输入用户输入:

 fscanf(fp, "%d\n", &n);

不大于MAX_COURSES