if(!file) {
 MessageBox(0,"lỗi không file đọc","lỗi",0);
 return 0;
 }
 //mở file để ghi ra
 fstream file2;
 file2.open("c:\\p.exe",ios::binary|ios::out);
 if(!file2) {
 MessageBox(0,"lỗi không file ghi","lỗi",0);
 return 0;
 }
 //đọc/ghi file
 file.read(chuoi,10000);
 file2.write(chuoi,10000);
 //đóng file
 file.close();
 file2.close();
 return 0;
 }
 

" />
  • Thứ Ba, 01/12/2009 09:45 (GMT+7)

    Cách dùng hàm read trong VC++ với số lượng kí tự lớn

    Câu hỏi :

    Tôi sử dụng hàm read (trong VC++, thư viện fstream.h) để mở file *.exe dưới dạng đọc/ghi nhị phân với dung lượng lớn (khoảng 1MB) thì bị lỗi tràn bộ nhớ. Xin hỏi cách sử dụng hàm đối_tượng.read (chuỗi, số ký tự) với số ký tự lớn vì với VC++6.0 tôi chỉ ghi được khoảng 10000 ký tự.
     

    Sau đây là code của tôi:
     //File ReadWriteFile.cpp
     #include <iostream.h>
     #include <fstream.h>
     #include <windows.h>
     //điểm nhập của chương trình
     int main(int argc, char* argv[]) {
     fstream file;
     char chuoi[10000];
     //mở file để đọc vào
     file.open("C:\\s.exe",ios::binary|ios::in);
     if(!file) {
     MessageBox(0,"lỗi không file đọc","lỗi",0);
     return 0;
     }
     //mở file để ghi ra
     fstream file2;
     file2.open("c:\\p.exe",ios::binary|ios::out);
     if(!file2) {
     MessageBox(0,"lỗi không file ghi","lỗi",0);
     return 0;
     }
     //đọc/ghi file
     file.read(chuoi,10000);
     file2.write(chuoi,10000);
     //đóng file
     file.close();
     file2.close();
     return 0;
     }
     



    Trả lời :
    Thật ra tác vụ read/write của đối tượng fstream cho phép đọc/ghi N byte bất kỳ, tối đa là 4GB. Tùy theo độ lớn của buffer chứa dữ liệu mà ta read/write mỗi lần bao nhiêu byte. Cụ thể trong mã nguồn của bạn, bạn khai báo biến chuỗi chỉ có 10000 byte nên mỗi lần bạn chỉ có thể đọc/ghi tối đa 10000 byte. Nếu muốn đọc/ghi mỗi lần nhiều hơn, bạn chỉ cần khai báo lại biến chuỗi có độ lớn cao hơn.
     Lưu ý, mỗi chương trình chạy trên Windows đều được cấp phát bộ nhớ ảo tối đa là 4GB, do đó bạn có thể xác định độ lớn của file cần đọc/ghi, xin cấp phát động buffer với độ lớn phù hợp rồi dùng lệnh read/write để đọc/ghi toàn bộ file. Thí dụ chương trình VC++ sau đây sẽ demo ý tưởng trên. Ở đây chúng tôi chỉ dùng các hàm truy xuất file cơ bản trong thư viện chuẩn io.h:
     //chương trình đọc/ghi file
     #include <fcntl.h>
     #include <io.h>
     #include <stdio.h>
     //điểm nhập của chương trình
     int main(int argc, char* argv[]) {
     int fin, fout;
     int flen;
     char* buffer;
     //mở file để đọc vào
     if ((fin = open("c:\\s.exe",O_RDONLY|O_BINARY))< 0) {
     printf("Không thề mở file c:\\s.exe\n");
     exit(1);
     }
     //mở file để ghi ra
     if ((fout = open("c:\\p.exe",O_WRONLY|O_BINARY|O_CREAT))< 0) {
     printf("Không thề mở file c:\\p.exe\n");
     exit(1);
     }
     //xác định độ lớn của file
     flen = filelength(fin);
     //cấp phát động buffer chứa dữ liệu
     buffer = (char*) malloc(flen);
     if (buffer==0) {
     printf("Không thể cấp phát buffer chứa file\n");
     exit(1);
     }
     //đọc/ghi toàn bộ file
     read(fin,buffer,flen);
     write(fout,buffer,flen);
     //đóng các file lại
     close (fin);
     close(fout);
     }
     
    Chuyên mục: Lập trình