• Thứ Ba, 17/07/2007 09:48 (GMT+7)

    Cách ghi dữ liệu lên file trong VC++?

    Câu hỏi :
    Xin hỏi cách ghi dữ liệu lên file trong VC++?
     

    Trả lời :

    Bản thân ngôn ngữ lập trình không cung cấp trực tiếp các lệnh truy xuất tài nguyên nói chung và truy xuất file nói riêng. Việc hỗ trợ truy xuất tài nguyên của máy là nhiệm vụ của các thư viện. Nếu lập trình bằng VC++, bạn có thể truy xuất file bằng cách gọi các hàm thư viện ở nhiều cấp độ khác nhau, từ cấp thấp đến cấp cao thông qua các đối tượng. Hai dạng file phổ biến là file văn bản và file nhị phân, trong đó dạng file nhị phân là tổng quát nhất.

     Nếu muốn ghi dữ liệu nhị phân ra file, bạn hãy tham khảo chương trình nhỏ sau đây, nó demo việc tạo file mới rồi ghi 1 chuỗi byte trong biến dữ liệu ra file thông qua việc gọi các hàm trong thư viện io.h cấp thấp (_open,_write, _read, close,...)
     
     //----------------------------------
     //Chương trình này mở file để lưu dữ liệu
     //rồi lưu 1 chuỗi dữ liệu của biến buffer ra file
     //----------------------------------
     //include các file đặc tả thư viện cần dùng
     #include <io.h>
     #include <stdio.h>
     #include <stdlib.h>
     #include <fcntl.h>
     #include <sys/types.h>
     #include <sys/stat.h>
     //định nghĩa biến chứa dữ liệu cần lưu
     char buffer[] = "This is a test of '_write' function";
     //điểm nhập của ứng dụng
     void main (void) {
     int fh;
     unsigned byteswritten;
     //mở file để ghi dữ liệu nhị phân
     if((fh = _open("write.o", _O_RDWR | _O_CREAT, _S_IREAD | _S_IWRITE )) != -1) {
     //ghi dữ liệu ra file
     if((byteswritten = _write(fh, buffer, sizeof(buffer))) == -1)
     perror("Write failed");
     else
     printf("Wrote %u bytes to file\n", byteswritten);
     //đóng file
     _close (fh);
     }
     }
     Nếu muốn ghi dữ liệu văn bản ra file, bạn hãy tham khảo chương trình nhỏ sau đây, nó demo việc tạo file mới, định dạng dữ liệu cần ghi thành chuỗi văn bản rồi ghi chuỗi kết quả ra file thông qua việc gọi các hàm trong thư viện chuẩn stdio.h (fopen,fprintf, fclose,...).
     
     //----------------------------------
     //Chương trình này mở file để lưu dữ liệu
     //rồi định dạng các dữ liệu cần ghi thành dạng văn bản
     //rồi lưu chuỗi văn bản ra file
     //----------------------------------
     //include các file đặc tả thư viện cần dùng
     #include <stdio.h>
     #include <process.h>
     FILE *stream;
     //điểm nhập của ứng dụng
     void main (void) {
     //định nghĩa các biến chứa dữ liệu cần lưu
     int i = 10;
     double fp = 1.5;
     char s[] = "this is a string";
     char c = '\n';
     //mở file để ghi chuỗi
     stream = fopen ("fprintf.out", "w");
     //định dạng dữ liệu thành văn bản rồi ghi kết quả
     fprintf (stream, "%s%c", s, c);
     //định dạng dữ liệu thành văn bản rồi ghi kết quả
     fprintf (stream, "%d\n", i);
     //định dạng dữ liệu thành văn bản rồi ghi kết quả
     fprintf (stream, "%f\n", fp);
     //đóng file lại
     fclose (stream);
     //gọi tiện ích type của hệ thống hiển thị nội dung file lên mà hình
     system("type fprintf.out");
     }
     Nếu muốn đọc/ghi dữ liệu vào/ra file theo trường phái hướng đối tượng, bạn hãy tham khảo chương trình nhỏ sau đây, nó demo việc dùng đối tượng ofstream trong thư viện fstream.h để tạo file mới (dạng nhị phân hay dạng văn bản đều được), rồi ghi dữ liệu của ứng dụng ra file bằng cách gởi thông diệp đến tác vụ tương ứng của đối tượng file.
     
     #include <fstream.h>
     //định nghĩa kiểu dữ liệu người dùng
     struct Date {
     int mo, da, yr;
     };
     //điểm nhập ứng dụng
     void main() {
     //định nghĩa biến dữ liệu cần ghi
     Date dt = { 6, 10, 92 };
     //tạo đối tượng miêu tả file cần ghi
     ofstream tfile ("date.dat", ios::binary);
     //ghi dữ liệu bằng tác vụ write
     tfile.write ((char *)&dt, sizeof dt);
     }
     Nếu muốn đọc/ghi dữ liệu vào/ra file bằng các hàm API Windows hầu sử dụng khả năng quản lý việc dùng chung file bởi nhiều ứng dụng chạy đồng thời, bạn hãy tham khảo chương trình nhỏ sau đây, nó demo việc dùng các hàm API Windows để tạo file mới (dạng nhị phân hay dạng văn bản đều được), rồi ghi dữ liệu của ứng dụng ra file.
     
     //định nghĩa kiểu dữ liệu người dùng
     struct Date {
     int mo, da, yr;
     };
     //định nghĩa các biến cần dùng
     HANDLE hFile;
     DWORD dwBytesWritten;
     //định nghĩa biến dữ liệu cần ghi
     Date dt = { 6, 10, 92 };
     //tạo file để đọc/ghi
     hFile = CreateFile("outdata.bin", // file name
     GENERIC_READ | GENERIC_WRITE, // open for read/write
     0, // do not share
     NULL, // no security
     CREATE_ALWAYS, // overwrite existing file
     FILE_ATTRIBUTE_NORMAL, // normal file
     NULL); // no attr. template
     
     //kiểm tra kết quả
     if (hFile == INVALID_HANDLE_VALUE) {
     ErrorHandler("Could not create temporary file.");
     }
     //ghi nội dung ra file
     WriteFile(hFile, &dt, sizeof(dt),
     &dwBytesWritten, NULL);
     //đóng file lại.
     CloseHandle(hFile); 
     

    Chuyên mục: Lập trình