/*
Bài 1.
Định dạng trong file SINHVIEN.TXT như sau:
- Dòng đầu tiên là thông tin của 1 sinh viên:
+ Họ tên
+ Mã sinh viên
+ Ngày tháng năm sinh: 1 chuỗi string định dạng dd/mm/yyyy
+ Điểm trung bình học kì
VD:
SINHVIEN.TXT
Nguyen Van Teo, N15DCCN165, 09/06/1997, 9.0
Nguyen Van B, N14DCCN189, 10/07/1996, 8.9
Nguyen Van C, N13DCCN181, 08/09/1995, 9.5
Nguyen Van C, N13DCCN179, 10/12/1995, 8.0
Nguyen Van B, N14DCCN185, 18/10/1995, 9.5
Yêu cầu:
1. Đọc dữ liệu từ file SINHVIEN.TXT
2. Nhập vào tên sinh viên và in ra màn hình thông tin sinh viên có tên trùng với tên cần tìm
3. Ghi thông tin sinh viên có điểm trung bình học kì cao nhất vào file DIEMMAX.TXT
*/
#include<iostream>
using
namespace
std
;
#include<string>
#include<fstream>
// khai báo cấu trúc sinh viên
struct
sinhvien
{
string
hoten
;
string
masv
;
string
namsinh
;
float
Diem_TBHK
;
};
typedef
struct
sinhvien
SINHVIEN
;
// khai báo cấu trúc danh sách sinh viên
struct
danhsach
{
SINHVIEN
*
arr
;
// khai báo con trỏ để quản lí mảng động sinh viên
int
n
;
// số lượng sinh viên hiện có trong danh sách
};
typedef
struct
danhsach
DANHSACH
;
// hàm đọc file - có tác dụng là đọc thông tin 1 thằng sinh viên từ file SINHVIEN.TXT
void
Doc_File_Thong_Tin_Sinh_Vien
(
ifstream
&
filein
,
SINHVIEN
&
sv
)
{
// đọc họ tên sinh viên
getline
(
filein
,
sv
.
hoten
,
','
);
// đọc dữ liệu đến dấu ',' thì dừng - sau đó con trỏ chỉ vị tự động nhảy qua dấu ','
filein
.
seekg
(
1
,
1
);
// dịch con trỏ chỉ vị sang phải 1 byte bắt đầu tại vị trí hiện tại
// đọc mã số sinh viên
getline
(
filein
,
sv
.
masv
,
','
);
filein
.
seekg
(
1
,
1
);
// dịch con trỏ chỉ vị sang phải 1 byte bắt đầu tại vị trí hiện tại
// đọc ngày tháng năm sinh
getline
(
filein
,
sv
.
namsinh
,
','
);
// đọc điểm trung bình học kì của sinh viên
filein
>>
sv
.
Diem_TBHK
;
// tránh cái lỗi dữ liệu bị xuống dòng
string
temp
;
getline
(
filein
,
temp
);
}
// hàm đọc danh sách sinh viên
void
Doc_Danh_Sach_Sinh_Vien
(
ifstream
&
filein
,
DANHSACH
&
ds
)
{
for
(
int
i
=
0
;
i
<
ds
.
n
;
i
++
)
{
// đọc thông tin 1 thằng sinh viên
Doc_File_Thong_Tin_Sinh_Vien
(
filein
,
ds
.
arr
[
i
]);
// đọc thông tin sinh viên thứ i
}
}
// hàm test - xuất thông tin sinh viên
void
Xuat_Thong_Tin
(
SINHVIEN
x
)
{
cout
<<
"
\n
Ho ten:"
<<
x
.
hoten
;
cout
<<
"
\n
Ma so:"
<<
x
.
masv
;
cout
<<
"
\n
Ngay thang nam sinh:"
<<
x
.
namsinh
;
cout
<<
"
\n
Diem trung binh hoc ki:"
<<
x
.
Diem_TBHK
;
}
// hàm test - xuất danh sách sinh viên ra màn hình để xem
void
Xuat_Danh_Sach
(
DANHSACH
ds
)
{
for
(
int
i
=
0
;
i
<
ds
.
n
;
i
++
)
{
cout
<<
"
\n\n\t\t
SINH VIEN THU "
<<
i
+
1
;
Xuat_Thong_Tin
(
ds
.
arr
[
i
]);
}
}
int
main
()
{
// khai báo đối tượng đọc file
ifstream
filein
;
filein
.
open
(
"SINHVIEN.TXT"
,
ios_base
::
in
);
DANHSACH
ds
;
//Doc_File_Thong_Tin_Sinh_Vien(filein, x);
int
dem
=
0
;
// BƯỚC 1: đọc xem trong file SINHVIEN.TXT có bao nhiêu dòng - để cấp phát mảng động
while
(
filein
.
eof
()
==
false
)
{
string
x
;
getline
(
filein
,
x
);
// đọc hết tất cả dữ liệu trên 1 dòng
dem
++
;
}
ds
.
n
=
dem
;
// BƯỚC 2: cấp phát mảng động sinh viên
ds
.
arr
=
new
SINHVIEN
[
ds
.
n
];
// BƯỚC 3: cho con trỏ chỉ vị chạy về đầu file
filein
.
seekg
(
0
,
0
);
// dịch con trỏ chỉ vị về đầu file
// BƯỚC 4: đọc danh sách sinh viên
Doc_Danh_Sach_Sinh_Vien
(
filein
,
ds
);
Xuat_Danh_Sach
(
ds
);
filein
.
close
();
delete
[]
ds
.
arr
;
// giải phóng bộ nhớ cho con trỏ
system
(
"pause"
);
return
0
;
}