01/10/2018, 11:49

Lỗi khi input File trong C

Mình không đoc File bài code này dc ạ, mong mọi ngưoi giúp dùm

#include <stdio.h>
struct sv
{
	int MSSV;
	char HoTen[50];
	double Toan, Ly, Hoa;
};
void Nhapsv(sv &s)
{
	printf("Nhap mssv: ");
	scanf_s("%d", &s.MSSV);
	rewind(stdin);
	printf("Nhap Ho ten: ");
	gets_s(s.HoTen);
	do
	{
		printf("Nhap diem lan luot Toan, Ly, Hoa");
		scanf_s("%lf", &s.Toan);
		scanf_s("%lf", &s.Ly);
		scanf_s("%lf", &s.Hoa);
	} while ((s.Toan > 10 || s.Toan < 0) || (s.Ly > 10 || s.Ly < 0) || (s.Hoa > 10 || s.Hoa < 0));
}
void Nhapmangsv(sv*a, int &n)
{
	do
	{
		printf("Nhap n");
		scanf_s("%d", &n);
	} while (n < 1);
	for (int i = 0; i < n; i++)
		Nhapsv(a[i]);
}
void Xuatsv(sv s)
{
	printf("%d 	%s 	%lf 	%lf 	%lf 	 
", s.MSSV, s.HoTen, s.Toan, s.Ly, s.Hoa);
}
void Xuatmang(sv*a, int  n)
{
	printf("MSSV, HoTen, Toan, Ly, Hoa 
");
	for (int i = 0; i < n; i++)
		Xuatsv(a[i]);
}
void LoadFilemang(sv*a, int & n)
{
	n = 0;
	FILE*f = fopen("Text.txt", "r");
	if (f == NULL)
	{
		printf("Khong thuc hien duoc 
");
		return;
	}
	while (!feof(f))
	{
		if ((fscanf(f, "%d", &a[n].MSSV) && fgets(a[n].HoTen, 50, f) && fscanf(f, "%lf", &a[n].Toan) && fscanf(f, "%lf", &a[n].Ly) && fscanf(f, "%lf", &a[n].Hoa)))
			n++;
	}

	fclose(f);

}


void main()
{
	int n = 0, chon;
	sv *a = new sv[100];
	do
	{
		printf("0. THoat chuong trinh 
");
		printf("1. Nhap mang sv 
");
		printf("Ban muon chon chuc nang nao ");
		scanf_s("%d", &chon);
		switch (chon)
		{
		case 0:
			return;
		case 1:
		{
			int chon1;
			printf("1. Nhap tu ban phim
");
			printf("2. Loadfilemang
");
			printf("Vui long chon");
			scanf_s("%d", &chon1);
			switch (chon1)
			{
			case 1:
			{
				Nhapmangsv(a, n);
				break;
			}
			case 2:
				LoadFilemang(a, n);
				break;
			default:
				break;
			}
		}
		
		default:
			printf("K co chuc nang nay 
");
			break;
		}
	} while (chon != 0);

}

Nó không xuat dc gì ra màn hình hêt ạ

Hung viết 13:54 ngày 01/10/2018

File Text:

1 Nguyen Van A 10 9 8
2 Tran Thi B  9 7 6
HK boy viết 14:02 ngày 01/10/2018

Việc đọc file của bạn bị lỗi. Nếu string không đủ 50 kí tự thì sao?

Tốt nhất bạn nên đọc cả dòng dưới dạng string rồi xử lí để tách số và tên riêng ra.
Theo cấu trúc file của bạn thì mỗi dòng có số đầu tiên là chỉ số, còn 3 số cuối là điểm. Khi biết được cấu trúc từng dòng, cấu trúc file thì việc đọc dễ dàng hơn.

Hung viết 14:02 ngày 01/10/2018

Cảm ơn bạn, nhưng mà mình vẫn k hiểu lắm. Nếu dc thì bạn giải thích rõ hơn chút giúp mình dc không, tại phần đọc file này kiến thức mình cũng khá yếu.

HK boy viết 14:05 ngày 01/10/2018

1 Nguyen Van A 10 9 8

Bạn thấy không, xâu Nguyen Van A của bạn chưa đủ 50 kí tự, khi bạn đọc 50 kí tự thì xâu của bạn khi đọc sẽ lấy thêm cả phần điểm ở sau nữa.

Tốt nhất là bạn chuyển sang đọc xâu, vì dòng của bạn đều có dạng

<id> <tên> <điểm1> <điểm2> <điểm3>
  • Từ vị trí 0 -> vị trí dấu cách đầu tiên (= p0): id
  • Từ vị trí cuối cùng -> vị trí dấu cách cuối cùng (= p3): điểm 3
  • Từ vị tri p3 -> vị trí dấu cách gần nhất trước p3 (= p2): điểm 2
  • Từ vị trí p2 -> vị trí dấu cách gần nhất trước p2 (= p1): điểm 1
  • Còn lại, từ vị trí p0 + 1 (bỏ qua 1 kí tự cách ở vị trí p0) -> p1 - 1 (bỏ qua 1 kí tự cách ở vị trí p1): tên người
Hung viết 13:59 ngày 01/10/2018

Cảm ơn bạn, để mình làm thử.

Bài liên quan
0