Phần code sau thao tác với con trỏ, trong bài toán đọc dữ liệu từ 1 file trên ổ cứng, và in ra kết quả ra một file khác. Công việc tưởng chừng như vô bổ này lại rất nhiều vẫn đề !! Vấn đề thứ nhât: Đọc các thông tin trên file không phải là các số mà là các các kí tự kiệu “char”. Vấn đề thứ 2: dùng cấu trúc dữ liệu kiểu con trỏ để làm việc. Các file cs tên là “dataFile1.txt” và “dataFile2.txt” cần được tạo ra.
////////////////////////
#include<iostream>
#include”string.h”
#include<fstream>//thư viện này là cần thiết khi làm việc với các file dữ liệu
using namespace std;
//node là cấu trúc của một nút trong danh sách (link)
struct Node {
—char HoTen[25];
—char QueQuan[30];
—int Diem;
—Node *Next; //một trường chứa địa chỉ được đặt tên là ‘next’
};
class SinhVien {
—Node *Ptr;
—int Total;
public:
—SinhVien(){Ptr=NULL; Total = 0;}
—void NhapDS(char *nameFile1);
—void InDS(char *nameFile2);
};
//chuong trinh chinh
void main() {
— SinhVien QLSV;
—cout<<”\nDang lay du lieu va tu fie”;
—QLSV.NhapDS(“D:\\dataFile1.txt”);
—cout<<”Dang ghi danh sach SV: “;
—QLSV.InDS(“D:\\dataFile2.txt”);
—cout<<”\nDone”;
}
//cai dat cac ham
void SinhVien::NhapDS(char *nameFile1) {
— Node *P,*P1; //khai báo hai con trỏ lúc này nó chưa được cấp phát bộ nhớ đâu
—int n = 0;
—ifstream dataFile(nameFile1);// ofstream dùng để biết nameFile1 này là để đưa dữ liệu vào. “I” = “In”
//kien tra su dung dan cua file du lieu nhu sau
— if(!dataFile.fail()){
——dataFile>>Total;
——dataFile.ignore();//sau khi doc ki tu Total thì trên bộ đệm của bàn phím để lại kí tự enter sẽ làm trôi các
—— do{ //kí tự được đọc vào sau đó dùng hàm ignore() để xoá kí tự enter này.
——P = new Node; //lấy bộ nhớ cho node P đã được khai báo từ lúc nãy.
——//đọc các thông tin từ fiele như sau:
—— dataFile.get(P->HoTen,25);
——dataFile.ignore();
——dataFile.get(P->QueQuan,30);
——dataFile.ignore();
——dataFile>>P->Diem;
——dataFile.ignore();
——P->Next =NULL; //gán trường địa chỉ của nút đầu tiên trong link này là NULL, nhớ không viết là ‘null’.
——if(Ptr ==NULL) //nếu chưa có node nào trong link thì để con trỏ chuyên trỏ đến đầu danh sách này trỏ vào
———Ptr = P; //node đó
——else { ngược lại tìm đến node cuối cùng để thêm P vào link
———P1 = Ptr;
———while(P1->Next!=NULL)
————P1 = P1->Next;
———P1->Next = P;
——}
——n++; //tăng n lên để kiểm tra xem đã cấp phát bộ nhớ bằng số học sinh được định trong file đầu vào chưa
——}while(n!=Total);
—}
—else{
——exit(1);
——cout<<”\nFile is fail.”;
—}
—dataFile.close();
}
//ghi ra file
void SinhVien::InDS(char *nameFile2) {
—Node *P2;//kha báo con trỏ này để duyệt từ đầu link đến cuối link
—P2 = Ptr; //gán con trỏ mới được khai này vào con trỏ luôn trỏ đến đầu link
—ofstream dataFile(nameFile2); //ofstream dùng để biết nameFile2 này là để xuất dữ liệu “O” = “Out”
—for(int i=1;i<=Total;i++){
——dataFile<<”\nSinh Vien thu “<<i;
——dataFile<<”\nHo Ten SV : “<<P2->HoTen;
——dataFile<<”\nQue Quan SV : “<<P2->QueQuan;
——dataFile<<”\nDiem: “<<P2->Diem;
——P2=P2->Next;
—}
—dataFile.close();
}
0 comments:
Đăng nhận xét