为什么这段语句:fscanf(sk,"%s,%s,%s,%s,%s,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf",m1->xuehao,m1->xinmin,m1->xinbie,m1->dizhi,m1->dianhua,m1->yuwen,m1->shuxue,m1->waiyu,m1->pinjun,m1->minci,m1->pinde,m1->zonghe,m1->zongheminci);只会把值赋给第一个字符串
时间: 2024-03-29 15:39:01 浏览: 58
这段语句中的格式控制字符串 "%s,%s,%s,%s,%s,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf" 表示读取输入流中的多个字符串和多个浮点数,以逗号作为分隔符。因此,应该按照逗号分隔每个字段。正确的写法是:
fscanf(sk, "%s,%s,%s,%s,%s,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf", m1->xuehao, m1->xinmin, m1->xinbie, m1->dizhi, m1->dianhua, &m1->yuwen, &m1->shuxue, &m1->waiyu, &m1->pinjun, &m1->minci, &m1->pinde, &m1->zonghe, &m1->zongheminci);
注意到,浮点数类型的变量应该使用取地址符 "&" 传递给 fscanf 函数。
相关问题
void daoru(){ p=head; FILE *sk=fopen("daoru.txt","r"); if (sk==NULL){ printf("无法打开文件\n"); } while(p->next!=NULL) p=p->next; list *m1=(struct list*)malloc(sizeof(struct list)); p->next=m1; while(!feof(sk)){ list *m1=(struct list*)malloc(sizeof(struct list)); int end=fscanf(sk,"%s,%s,%s,%s,%s,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf",m1->xuehao,m1->xinmin,m1->xinbie,m1->dizhi,m1->dianhua,m1->yuwen, m1->shuxue,m1->waiyu,m1->pinjun,m1->minci,m1->pinde,m1->zonghe,m1->zongheminci); if(end==-1) break; printf("学号:%s|姓名:%s|性别:%s|地址:%s|电话:%s|语文:%lf|数学:%lf|外语:%lf|考试成绩:%lf|名次:%lf|品德:%lf|综合分:%lf|综合名次:%lf|\n" ,m1->xuehao,m1->xinmin,m1->xinbie,m1->dizhi,m1->dianhua,m1->yuwen,m1->shuxue,m1->waiyu,m1->pinjun,m1->minci,m1->pinde,m1->zonghe,m1->zongheminci); p->next=m1; p=m1; } fclose(sk); }的输出结果为什么是:学号:1,1,1,1,1,0,0,0,0.000,0,0,0,0|姓名:|性别:|地址:|电话:|语文:0.000000|数学:0.000000|外语:0.000000|考试成绩:0.000000|名次:0.000000|品德:0.000000|综合分:0.000000|综合名次:0.000000|
) / 2;
q = head;
while (q->number != mid) {
q = q->next;
}
if (q->number < p->number) {
low = mid + 1;
} else {
high = mid - 1;
}
}
Book *temp = (Book *)malloc(sizeof(Book));
memcpy(temp, p, sizeof(Book根据代码中的 fscanf 函数,可以看出它是按照逗号分隔符来读取文件中的数据的。));
Book *s = head;
while (s->next != r) {
s = s->next;
}
s因此,可以得知文件中每行数据的格式应该为:学号,姓名,性别,地址,电话,->next = r->next;
free(p);
if (q == head) {
temp->next = head;
head = temp;
} else {
Book *t = head;
while (t->next != q) {
t = t->next语文成绩,数学成绩,外语成绩,平均分,名次,品德成绩,综合;
}
t->next = temp;
temp->next = q;
}
p = r;
}
}
// 折分,综合名次。
但是,根据输出结果可以看出,代码读取文件时出现了问题,导半查找
void binarySearch(Book *head, char *ISBN) {
Book *p = head;
int low = 1, high = countNodes(head), mid;
while (low <= high) {
mid = (low + high) / 2;
致数据读取不正确。具体问题可能是文件中的数据格式与代码中的 fscanf 函数的参数不匹配, p = head;
while (p->number != mid) {
p = p->next;
}
if (strcmp(p或者是代码中的链表操作有误。建议逐步排查代码中的问题,找出出错的原因。
void daoru(){ p=head; FILE *sk=fopen("daoruxinxi.txt","r"); FILE *sp=fopen("daorushuju.txt","r"); if (sk==NULL&&sp==NULL){ printf("无法打开文件\n"); } while(p->next!=NULL) p=p->next; list *m1=(struct list*)malloc(sizeof(struct list)); p->next=m1; while(!feof(sk)&&!feof(sp)){ list *m1=(struct list*)malloc(sizeof(struct list)); int end=fscanf(sk,"%[^,],%[^,],%[^,],%[^,],%s\n",m1->xuehao,m1->xinmin,m1->xinbie,m1->dizhi,m1->dianhua); int end1=fscanf(sp,"%.0lf,%.0lf,%.0lf,%.3lf,%.0lf,%.0lf,%.0lf,%.0lf",&m1->yuwen,&m1->shuxue,&m1->waiyu,&m1->pinjun,&m1->minci,&m1->zonghe,&m1->zongheminci); if(end==-1&&end1==-1) break; printf("学号:%s|姓名:%s|性别:%s|地址:%s|电话:%s|语文:%lf|数学:%lf|外语:%lf|考试成绩:%lf|名次:%lf|品德:%lf|综合分:%lf|综合名次:%lf|\n" ,m1->xuehao,m1->xinmin,m1->xinbie,m1->dizhi,m1->dianhua,m1->yuwen,m1->shuxue,m1->waiyu,m1->pinjun,m1->minci,m1->pinde,m1->zonghe,m1->zongheminci); p->next=m1; p=m1; } fclose(sk); fclose(sp); }的第二个fscanf无法成功读取
可能出现无法读取的原因有以下几个:
1. 文件不存在或无法打开:如果你传递给fscanf的文件指针为NULL,或者文件不存在或打开失败,那么fscanf将无法从文件中读取任何数据。
2. 文件中的数据格式不匹配:fscanf函数需要知道从文件中读取的数据的格式,如果文件中的数据格式与你传递给fscanf的格式字符串不匹配,那么fscanf将无法正确地解析数据。
3. 文件中没有可读取的数据:如果文件中没有数据可以被读取,那么fscanf将返回0。
4. 其他错误:如果文件中的数据不符合你的预期,比如包含了错误的字符或无法转换为正确的数据类型,那么fscanf可能会返回0或其他错误代码。
你可以检查以上原因,看看是哪一个导致了第二个fscanf无法成功读取的问题。如果无法确定问题所在,可以在代码中加入一些调试语句,输出一些变量的值,以便更好地理解程序的执行过程。
阅读全文