01/10/2018, 15:28

Xử lý trên file tập tin

Mình có một bài tập là tạo hàm nhập vào thông tin sinh viên theo mảng cấu trúc, sau đó ghi ra file .txt và đọc file đó. Thiệt tình là mình không biết sai chỗ nào, xuất bằng for() trong hàm main thì bị lỗi Thiếu chữ (N), xuất bằng hàm Xuat thì cũng bị lỗi đó và thêm lỗi xuống dòng. Xin các cao nhân góp ý kiến
Đây là code của mình:

#include<stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
typedef struct {
	int id;
	char fname[35];
	char finame[10];
	float p;
}sinhvien;
//Ham nhap va ghi File
void Nhap()
{
	sinhvien *sv;
	FILE *taptin = NULL;
	errno_t err;
	int i = 0;
	sv = (sinhvien*)malloc(sizeof(sinhvien));
	int maso = 0;
	err = fopen_s(&taptin, "danhsachsinhvien.txt", "w");
	if (taptin != NULL)
	{
		while (maso != -1)
		{
			printf("
Nhap vao MSSV. Nhap (-1) de ket thuc: ");
			scanf_s("%d", &maso);
			while (getchar() != '
' && getchar() != EOF) {}
			if (maso != -1)
			{
				sv[i].id = maso;
				printf("
Nhap vao Ho va ten: ");
				gets_s(sv[i].fname);
				printf("
Nhap vao diem trung binh tich luy: ");
				scanf_s("%f", &sv[i].p);
				fprintf(taptin, "%5d%25s%5.2f
", sv[i].id, sv[i].fname, sv[i].p);
				i++;
				sv = (sinhvien*)realloc(sv, (i + 1) * sizeof(sinhvien));
 			}
			else break;
		}
	}
	fclose(taptin);
}
//Ham doc FILE
sinhvien *Read(int *n)
{
	sinhvien *sv;
	FILE *taptin = NULL;
	errno_t err;
	int i = 0;
	sv = (sinhvien*)malloc(sizeof(sinhvien));
	err = fopen_s(&taptin, "danhsachsinhvien.txt", "r");
	if (taptin != NULL)
	{
		while (!feof(taptin))
		{
			fscanf_s(taptin, "%d%f", &sv[i].id, &sv[i].p);
			fgets(sv[i].fname, 100, taptin);
			i++;
			sv = (sinhvien*)realloc(sv, (i + 1) * sizeof(sinhvien));
		}
	}
	else return 0;
	i--;
	*n = i;
	fclose(taptin);
	return sv;
}
void Xuat(sinhvien *sv, int *n)
{
	int i;
	printf("
Danh sach sinh vien
");
	for (i = 0; i < *n; i++)
	{
		printf("%5d%25s%5.2f
", sv[i].id, sv[i].fname, sv[i].p);
	}
}
int main()
{
	sinhvien *sv;
	int n = 0;
	//Nhap();
	sv = Read(&n);
	Xuat(sv, &n);
	/*for(int i = 0; i < n; i++)
		printf("%5d%25s%5.2
", sv[i].id, sv[i].fname, sv[i].p);*/
	printf("
%d", n);
	free(sv);
	_getch();
	return 0;
}
Vesper Link viết 17:44 ngày 01/10/2018

Có thể do độ dài fname ngắn quá. Bạn thử tăng lên xem sao.
Lâu rồi chưa đụng vào C

Gấu Lớn viết 17:34 ngày 01/10/2018

thử rồi bác ơi, nó vẫn mất chữ ‘N’, còn mấy chữ cái khác thì không bị gì

Vesper Link viết 17:30 ngày 01/10/2018

Upload cái file dữ liệu txt của bạn lên đây xem thử

Gấu Lớn viết 17:30 ngày 01/10/2018

Đây nè bác file này mình tự nhập bằng hàm Nhap(). Link: https://goo.gl/7Ggvw5
Hình này là in ra màn hình bằng for() trong hàm main


Hình này là in ra màn hình bằng hàm Xuat()

rogp10 viết 17:29 ngày 01/10/2018

while (getchar() != '\n' && getchar() != EOF)

Bị mất chữ là do getchar() hai lần đây mà; cứ getchar 1 lần là lấy đi 1 chữ.

Lỗi tiếp theo thì bạn break ngay chỗ nhập điểm xem.

Gấu Lớn viết 17:39 ngày 01/10/2018

Mình thử While(getchar() != '\n'); với bỏ luôn cái break cũng vẫn vậy. Mình nghĩ code của mình sai ở hàm Read(), tại vì lúc in ra thành phần sv.p(điểm trung bình) không có giá trị nhưng mà giá trị của nó lại đi chung với thành phần chứa tên (sv.fname)… nhưng mà mình không biết sửa làm sao

Vesper Link viết 17:42 ngày 01/10/2018

Trên máy tôi chạy bình thường ko mất gì cả

Gấu Lớn viết 17:37 ngày 01/10/2018

nó in ra màn hình như nào vậy bạn, chụp cho mình coi với

Bài liên quan
0