Vì sao nếu thêm \n thì kết quả in ra đúng?

Các anh ơi vì sao ở dòng 53 nếu em thêm \n thì kết quả in ra đúng còn nếu bỏ \n đi thì nó sẽ ra mấy cái kí tự lạ vậy ạ???(Code C)
\n


Không có \n

code đây ạ(Do em không lưu code cũ. Code này bị sửa để dễ nhìn hơn ạ)
chỗ em cần hỏi em kèm cmt sau ấy ạ

#include <stdio.h>
#include<stdlib.h>

typedef struct{
	int van;
	int toan;
	int anh;
	float tbmon;
}score;

typedef struct{
	int id;
	char *name;
	int age;
	char *sex;
	score diem;
}info;

void nhap_info(info *sv ,const int i , FILE *fin){
	
	sv[i].name = malloc(20 * sizeof(char));
	sv[i].sex = malloc(20 * sizeof(char));
	printf("Nhap ten , tuoi , gioi tinh , diem van, toan, anh:\n");
	scanf("%s %d %s %d %d %d",sv[i].name , &sv[i].age ,sv[i].sex ,&sv[i].diem.van,&sv[i].diem.toan,&sv[i].diem.anh);
	fflush(stdin);
	sv[i].diem.tbmon = (float)(sv[i].diem.anh + sv[i].diem.van + sv[0].diem.toan) / 3;
	fprintf(fin,"%10s %5d %10s %5d %5d %5d %f\n",sv[i].name , sv[i].age ,sv[i].sex ,sv[i].diem.van,sv[i].diem.toan,sv[i].diem.anh , sv[i].diem.tbmon);
	free(sv[i].name );
	free(sv[i].sex );
}

void xuat_info(info *sv , const int i){
	printf("%10s %5d %10s %5d %5d %5d %.2f\n",sv[i].name , sv[i].age ,sv[i].sex ,sv[i].diem.van,sv[i].diem.toan,sv[i].diem.anh , sv[i].diem.tbmon);
	free(sv[i].name );
	free(sv[i].sex );
}

void nhap_them_sv(info *sv){
	FILE *fin = fopen("C:\\Users\\hp\\Desktop\\Cprograming\\baitap6\\infosv.txt", "a");
	while(1){
		nhap_info(sv , 0 , fin);
		printf("\nPress 0.Exit ? ");
		int luachon;
		scanf("%d", &luachon);
		fflush(stdin);
		if(luachon == 0){
			break;
		}
	}
	fclose(fin);
}

void hien_thi_ds_sv(info *sv){
	int i=0;
	FILE *fout = fopen("C:\\Users\\hp\\Desktop\\Cprograming\\baitap6\\infosv.txt", "r");
	while(!feof(fout)){
		sv[i].name = malloc(20);
		sv[i].sex = malloc(20);
		if(!feof(fout)){
			fscanf(fout,"%s %d %s %d %d %d %f\n",sv[i].name , &sv[i].age ,sv[i].sex ,&sv[i].diem.van,&sv[i].diem.toan,&sv[i].diem.anh , &sv[i].diem.tbmon);//Dấu \n ở dòng này ạ.
			xuat_info(sv , i); 
		}
	}
	fclose(fout);
}

int main(){
	info sv[100];
	int i = 0;
	//nhap
	nhap_them_sv(sv);
	//xuat
	hien_thi_ds_sv(sv);  
	
	  return 0;
}

Do thằng này. :slightly_smiling_face:

Khi đọc đến dòng cuối (chỉ có \n) feof() vẫn return false nhưng không có gì để đọc thành ra nó xuất giá trị rác là đúng rồi. :kissing:

Thay vì thế dùng fscanf(...) > 0 nhé.


Hơi không liên quan nhưng rõ ràng phần sau là bạn nhập thông tin từ file mà sao lại để tên là fout. :V :V

Còn nữa, đừng dùng Dev C/C++ và fflush(stdin). :slightly_smiling_face:

6 Likes

À cái này là do em tự quy ước fin là nhập vào file còn fout là xuất từ file ra. (hình như hơi ngược đời :man_facepalming: :man_facepalming: :man_facepalming:)

tại sao vậy ạ. Em thấy nhiều người dùng Code block nhưng em thấy Dev C / C++ vẫn chạy được(dù nó cũ thật) nên em cũng ko đổi

1 Like

Vì nó cũ quá rồi. :V

Phiên bản ổn định cuối cùng thì từ tận 15 năm trước, hình như vẫn còn xài gcc 4.9 hay sao á, mà giờ có gcc 10.1 luôn r. :kissing:


Với lại theo quan điểm cá nhân của mình thì mình khuyến kích newbie nên dùng editor và compiler hơn.

Chứ mấy câu hỏi của newbie thì đa số là toàn xài Dev C và lỗi đều tương tự nhau hết.

fflush(stdin). :neutral_face:

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?