30/09/2018, 16:56
Lỗi về hàm feof trong c
#include <stdio.h>
#include <stdlib.h>
#define MAX 50
//khai bao struct
typedef struct{
char name[30];
int diem;
}Student;
int input();
FILE *f;
Student *student;
int main()
{
int size = input();
return 0;
}
//doc du lieu trong file vao struct va in ra man hinh
int input()
{
if((f = fopen("bangdiem.txt","r")) == NULL){
printf("cannot open
");
return;
}
int size = 0;
while(!feof(f)){
student = (Student *)malloc(sizeof(Student));
fscanf(f,"%s%d",student->name,&student->diem);
printf("%s %d
",student->name,student->diem);
size++;
free(student);
}
printf("size = %d
",size);
fclose(f);
return size;
}
nội dung file
ledinhduy 5
levanhoang 6
tranhuuthinh 8
kết qủa in ra
ledinhhuy 5
levanthanh 6
levantan 8
8
size = 4
tại sao khi dùng feof thì nó lại bị thừa ra số 8 ở kết qủa và gía trị size trả lại lại là 4?? Mọi người sửa lỗi giúp mình và nếu có cách nào hay hơn thì chỉ cho mình với.
Bài liên quan
Trong C thì EOF không phải là một kí tự (non-character value). Vì vậy thằng fscanf sẽ cố đọc, thằng name gồm những ô kí tự nhưng thằng eof lại không phải kí tự nên nó không get vào name được. diem cũng sẽ cố đọc nhưng không được, nên đành lấy thằng buffer trước đó là 8 (riêng thằng diem thì mình không biết đúng không).
Bạn sửa lại như sau
cách này sẽ kiểm tra xem nó có đọc đủ 2 input hay không. fscanf sẽ return về số input mà nó đọc được.
thank bạn nha mình sửa được rồi nhưng mà còn cái đoạn " Trong C thì EOF không phải là một kí tự (non-character value). Vì vậy thằng fscanf sẽ cố đọc " đoạn này là sao bạn giai thích rõ hơn đc k và tại sao nó gặp EOF lại k dừng luôn mà lại còn đọc thêm nữa
Có thể đó là một tính năng mình cũng không biết chắc, nhờ cao thủ vào xử lí thôi