Đọc các file khác nhau bằng C++

Published by admin on

Bạn có thể dùng 1 trong nhiều thư viện C hay C++ khác nhau ở các mức độ từ thấp đến cao để truy xuất file, tuy nhiên để dễ dàng kiểm soát việc truy xuất file đồng thời bởi nhiều ứng dụng khác nhau, bạn nên dùng các hàm API của Windows hay các class đối tượng có sẵn trong MFC. Sau đây là đoạn code C++ thí dụ trong CD MSDN dùng các hàm API Windows như CreateFile, ReadFile, WriteFile, LockFile, UnLockFile, CloseHandle… để đọc nội dung file one.txt rồi ghi vào cuối file two.txt có sẵn:

 //khai báo các biến cần dùng
 HANDLE hFile;
 HANDLE hAppend;
 DWORD dwBytesRead, dwBytesWritten, dwPos;
 char buff[4096];
 // Mở file one.txt đã có sẵn
 hFile = CreateFile(“ONE.TXT”, // open ONE.TXT
 GENERIC_READ, // open for reading
 0, // do not share
 NULL, // no security
 OPEN_EXISTING, // existing file only
 FILE_ATTRIBUTE_NORMAL, // normal file
 NULL); // no attr. template
 
 //kiểm tra kết quả
 if (hFile == INVALID_HANDLE_VALUE) {
 ErrorHandler(“Could not open ONE.”); // process error
 }
 
 //Mở file two.txt, nếu chưa có thì tạo mới
 hAppend = CreateFile(“TWO.TXT”, // open TWO.TXT
 GENERIC_WRITE, // open for writing
 0, // do not share
 NULL, // no security
 OPEN_ALWAYS, // open or create
 FILE_ATTRIBUTE_NORMAL, // normal file
 NULL); // no attr. template
 
 //kiểm tra kết quả
 if (hAppend == INVALID_HANDLE_VALUE) {
 ErrorHandler(“Could not open TWO.”); // process error
 }
 
 //Đọc nội dung file one.txt rồi ghi vào cuối file two.txt
 //Có khóa file two.txt để cấm ứng dụng khác truy xuất trong lúc ghi dữ liệu
 //Rồi mở khóa sau khi hoạt động ghi hoàn thành
 do {
 //lặp đọc từng khối 4096 byte dữ liệu
 if (ReadFile(hFile, buff, 4096, &dwBytesRead, NULL)) {
 dwPos = SetFilePointer(hAppend, 0, NULL, FILE_END);
 LockFile(hAppend, dwPos, 0, dwPos + dwBytesRead, 0);
 WriteFile(hAppend, buff, dwBytesRead,&dwBytesWritten, NULL);
 UnlockFile(hAppend, dwPos, 0, dwPos + dwBytesRead, 0);
 }
 } while (dwBytesRead == 4096);
 
 // Đóng cả 2 file lại
 CloseHandle(hFile);
 CloseHandle(hAppend);