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;
}
Bài liên quan
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
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ì
Upload cái file dữ liệu txt của bạn lên đây xem thử
Đâ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()
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.
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 saoTrên máy tôi chạy bình thường ko mất gì cả
nó in ra màn hình như nào vậy bạn, chụp cho mình coi với