我正在尝试读取数据文件并将信息存储到课程结构数组(或指向课程结构的指针数组)中。此分配需要使用指向学生结构的指针数组来维护数据库。
当我尝试将数据文件扫描到数组中时,我遇到了分段错误。如何将文件中的信息正确存储到数组中?
#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: ");
答案 0 :(得分: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++;
}
答案 1 :(得分:0)
我认为最好与之合作 while(getline(string_variable ,,)!= EOF)。(在网上看看哪个参数放在getline中) 然后使用string_variable。查看数据存储在txt文件中的格式。例如:名称(空白)编号(空白)教师(空白)日期(空白)开始(空白)结束位置 开始在string_variable中查找空格。当你看到第一个空白副本从位置1的子字符串到空白-1位置到course_arr [count] .name变量时,然后从子句1删除子字符串到空白位置。再次查看第一个空白并将子字符串存储到course_arr [count] .number等等。
对不起,我的英文希望你有了意思
答案 2 :(得分:0)
您应该放弃&
来电中的所有fscanf
s。 char
数组已作为指针传递。如果您在-Wall
上使用gcc
选项(或任何其他编译器的类似选项),它也会警告您。
答案 3 :(得分:-1)
您是否检查过您正在阅读的文件是否存在。
添加吼叫
in = fopen(courseFile, "r+");
if(in == NULL)
{
printf("exit");
exit(0);
}
我想这可能是问题所在。