• Thứ Sáu, 04/06/2004 16:56 (GMT+7)

    Câu hỏi :

    Tôi viết chương trình ghi file văn bản bằng hàm API CreateFile và WriteFile, SetPointerFile trên môi trường VC++ 6.0, nhưng không thực hiện được điều khiển xuống dòng. Ví dụ tôi muốn ghi hai dòng sau:

    Chao em co gai Lam hong

    Nghe tieng bom gao dan roi

    thì kết quả là:

    Chao em co gai lam hong Nghe tieng bom gao dan roi.



    Trả lời :

    Các hàm API Windows như CreateFile, WriteFile, ReadFile, CloseFile chỉ truy xuất file nhị phân (binary), nghĩa là hàm WriteFile và ReadFile chỉ cho phép ghi/đọc mỗi lần n byte dữ liệu mà không hề biết và xử lý nghĩa của các byte này. Do đó nếu muốn dùng các hàm này để ghi/đọc văn bản thì trước khi ghi từng hàng văn bản, bạn phải tạo dữ liệu cho hàng văn bản đó với 2 ký tự đánh dấu xuống hàng CR, LF (mã 13, 10) nằm trong 2 byte cuối cùng của hàng văn bản đó. Thí dụ đoạn code VC++ sau sẽ tạo được file baitho.txt chứa 2 dòng thơ như bạn yêu cầu:

    void CMainFrame::OnFilewrite() {

       // TODO: Add your command handler code here

    HANDLE  hTempFile = CreateFile((LPTSTR) 'c:\\baitho.txt',  // 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

     

    if (hTempFile == INVALID_HANDLE_VALUE){

        MessageBox('Could not create temporary file.');

    } else {

       char buffer[256];

       unsigned long wlen;

       // tạo & ghi chuỗi byte miêu tả hàng 1

       strcpy(buffer,'Chao em co gai Lam hong');

       int len = strlen(buffer);

       buffer[len] = 13; // ký tự CR

       buffer[len+1] = 10; // ký tự LF

       WriteFile(hTempFile,buffer,len+2,&wlen,NULL);

       // tạo & ghi chuỗi byte miêu tả hàng 2

       strcpy(buffer,'Nghe tieng bom gao dan roi');

       len = strlen(buffer);

       buffer[len] = 13; // ký tự CR

       buffer[len+1] = 10; // ký tự LF

       WriteFile(hTempFile,buffer,len+2,&wlen,NULL);

       CloseHandle(hTempFile);

    }

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