【发布时间】:2015-03-31 17:45:34
【问题描述】:
我需要用学生和每个人的成绩写一个文件(不是二进制文件)(这个表格下的int note[10])。我没有收到任何错误,但是当我尝试编写文件时,只打印了最后一个成绩,我不知道如何打印整个列表。例如(int nr_note 表示学生有多少成绩)如果学生的成绩是 6、8、9,它只打印 9。 先感谢您。
#include <stdio.h>
#include <stdlib.h>
struct student{
int nr_matricol;
char nume[10];
int nr_note;
int note[10];
};
void citire_date(struct student *studenti, int n, FILE *f){
int i, j;
for(i=0;i<n;i++){
printf("Studentul %d\n", i+1);
printf("Numarul matricol: "); scanf("%d", &(studenti+i)->nr_matricol);
printf("Numele studentului: "); fflush(stdin); gets((studenti+i)->nume);
printf("Numarul de note: "); scanf("%d", &(studenti+i)->nr_note);
for(j=0;j<((studenti+i)->nr_note);j++){
printf("Nota %d: ", j+1); scanf("%d", &(studenti+i)->note[i]);
}
fprintf(f, "Numar matricol: %d\nNume: %s\nNote: %d \n", ((studenti+i)->nr_matricol) ,((studenti+i)->nume), ((studenti+i)->note[i]));
}
}
int main()
{
struct student studenti[20];
FILE *f;
int n;
f = fopen("studenti.txt", "w");
if(f==NULL){
printf("Nu s-a putut deschide/crea fisierul pentru scriere.");
exit(1);
}
printf("Introduceti numarul de studenti: "); scanf("%d", &n);
citire_date(studenti, n, f);
fclose(f);
return 0;
}
【问题讨论】:
-
fflush(stdin)是未定义的行为,fflush()只能在输出流中使用,您还应该使用数组语法来处理studenti -
如果我不使用 fflush() 它会读取“Numar matricol”,然后直接跳转到“Numarul de note”,它不会让我读取“Nume”
-
函数gets()有很多问题,一个主要问题是它允许输入缓冲区的缓冲区溢出。建议使用:fgets()
-
@OlarAndrei 使用函数来正确清除输入缓冲区,在输入流上使用
fflush()是未定义的行为,它不会做你最期望它做的事情时间。 -
在调用 scanf()(和系列)函数时,应始终检查返回值以确保输入/转换操作成功。