-1

我正在尝试读取数据文件并将信息存储到课程结构数组(或指向课程结构的指针数组)中。该作业需要使用指向学生结构的指针数组来维护数据库。

当我尝试将数据文件扫描到数组中时出现分段错误。如何正确地将文件中的信息存储到数组中?

#define SIZE        30
#define fieldLength 300
#define diskFile    "diskFile.dat"
#define courseFile  "course.dat"

struct student
{
    char name[fieldLength];
    int age[fieldLength]; 
    char course1[fieldLength];
    char course2[fieldLength];
    char remarks[fieldLength];      
}*sp[SIZE];

struct course 
{ 
    char name[fieldLength];
    char number[fieldLength];
    char instructor[fieldLength];
    char date[fieldLength];
    char starting[fieldLength];
    char ending[fieldLength];
    char location[fieldLength]; 
};

int main(int argc, char *argv[])
{
    int i, count;

    struct course course_arr[SIZE]; // an array of ten structs

    FILE * in; /*FILE pointer to do the stream IO*/
    in = fopen(courseFile, "r+");

    count = 0;
    while ((fscanf(in, "%s %s %s %s %s %s %s", 
                       &course_arr[count].name, 
                       &course_arr[count].number,
                       &course_arr[count].instructor, 
                       &course_arr[count].date, 
                       &course_arr[count].starting, 
                       &course_arr[count].ending, 
                       &course_arr[count].location)) != EOF)
    {       
        count++;        
    }

    /* print the menu */
    printf("\n-----------------------------------------------------------------\n");
    printf("|\t%-20s","(N)ew record");
    printf("%-20s","(U)pdate record");
    printf("Swa(p) records\t|\n");
    printf("|\t%-20s","(S)ort database");
    printf("%-20s","(C)lear database");
    printf("(D)isplay db\t|\n");

    printf("|\t%-20s","(L)oad disk");
    printf("%-20s","(W)rite disk");
    printf("(E)mpty disk\t|\n");

    printf("|\t%-20s", "(V)iew courses"); 
    printf("%-20s","(R)emove record");
    printf("(Q)uit   \t|\n");
    printf("-----------------------------------------------------------------\n");
    printf("choose one: ");
4

4 回答 4

0

我认为使用 while(getline(string_variable,,)!=EOF) 会更好。(在网上查找要放入 getline 的参数)然后使用 string_variable。查看数据存储到txt文件中的格式。eg: name(blank)number(blank)instructor(blank)date(blank)starting(blank)endinglocation 开始在string_variable 中寻找空白。当您看到第一个空白时,将子字符串从位置 1 复制到位置 blank-1 到 course_arr[count].name 变量。然后删除从位置 1 到位置空白的子字符串。再次查找第一个空白并将子字符串存储到 course_arr[count].number 等。

对不起我的英语希望你明白意思

于 2013-07-13T21:17:53.113 回答
0

您应该松开通话&中的所有 s 。数组已经作为指针传递fscanfchar如果您使用了-Wallon 选项gcc(或任何其他编译器的类似选项),它也会对此发出警告。

于 2013-07-13T21:23:00.023 回答
0

例行公事fscanf一去不复返EOF。测试fscanf小于预期字段的数量:

count = 0;
while((fscanf(in, "%s %s %s %s %s %s %s", &course_arr[count].name, &course_arr[count].number, &course_arr[count].instructor, &course_arr[count].date, &course_arr[count].starting, &course_arr[count].ending, &course_arr[count].location)) < 7){
     count++;
}
于 2013-07-13T20:42:07.993 回答
-1

您是否检查过您正在阅读的文件是否存在。

添加波纹管

 in = fopen(courseFile, "r+");

 if(in == NULL)
        {
        printf("exit");
        exit(0);
        }

我想这可能是问题所在。

于 2013-07-13T21:04:41.237 回答