PDA

View Full Version : Đọc các file khác nhau bằng C++



Cuni
10-09-2009, 09:51 AM
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);
Theo PCWORLD VN