請教一下...關於寫入檔案的問題 |
尚未結案
|
XXX.
一般會員 發表:1 回覆:2 積分:0 註冊:2004-07-27 發送簡訊給我 |
|
zilch
中階會員 發表:5 回覆:87 積分:78 註冊:2002-09-24 發送簡訊給我 |
HANDLE CreateFile( LPCTSTR lpFileName, // pointer to name of the file
DWORD dwDesiredAccess, // access (read-write) mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes
DWORD dwCreationDistribution, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to file with attributes to copy
);
lpFileName String﹐要打開的檔案的名字
dwDesiredAccess Long﹐如果為 GENERIC_READ 表示允許對設備進行讀存取﹔如果為 GENERIC_WRITE 表示允許對設備進行寫存取(可群組合使用)﹔如果為零﹐表示只允許獲取與一個設備有關的資訊
dwShareMode Long﹐零表示不共享﹔ FILE_SHARE_READ 和/或 FILE_SHARE_WRITE 表示允許對檔案進行共享存取
lpSecurityAttributes SECURITY_ATTRIBUTES﹐指向一個SECURITY_ATTRIBUTES架構的指標﹐定義了檔案的安全特性(如果作業系統支援的話)
dwCreationDisposition Long﹐下述常數之一﹕
CREATE_NEW 建立檔案﹔如檔案存在則會錯誤
CREATE_ALWAYS 建立檔案﹐會改寫前一個檔案
OPEN_EXISTING 檔案必須已經存在。由設備提出要求
OPEN_ALWAYS 如檔案不存在則建立它
TRUNCATE_EXISTING 講現有檔案縮短為零長度
dwFlagsAndAttributes Long﹐一個或多個下述常數
FILE_ATTRIBUTE_ARCHIVE 標記歸檔屬性
FILE_ATTRIBUTE_COMPRESSED 將檔案標記為已壓縮﹐或者標記為檔案在目錄中的預設壓縮方式
FILE_ATTRIBUTE_NORMAL 預設屬性
FILE_ATTRIBUTE_HIDDEN 隱藏檔案或目錄
FILE_ATTRIBUTE_READONLY 檔案為唯讀
FILE_ATTRIBUTE_SYSTEM 檔案為系統檔案
FILE_FLAG_WRITE_THROUGH 作業系統不得推遲對檔案的寫操作
FILE_FLAG_OVERLAPPED 允許對檔案進行重疊操作
FILE_FLAG_NO_BUFFERING 禁止對檔案進行緩衝處理。檔案只能寫入磁碟卷的扇區塊
FILE_FLAG_RANDOM_ACCESS 針對隨機存取對檔案緩衝進行優化
FILE_FLAG_SEQUENTIAL_SCAN 針對連續存取對檔案緩衝進行優化
FILE_FLAG_DELETE_ON_CLOSE 關閉了上一次打開的句柄後﹐將檔案解除。特別適合臨時檔案
也可在Windows NT下群組合使用下述常數標記﹕
SECURITY_ANONYMOUS﹐ SECURITY_IDENTIFICATION﹐ SECURITY_IMPERSONATION﹐ SECURITY_DELEGATION﹐ SECURITY_CONTEXT_TRACKING﹐ SECURITY_EFFECTIVE_ONLY
hTemplateFile Long﹐如果不為零﹐則指定一個檔案句柄。新檔案將從這個檔案中復制擴展屬性 BOOL WriteFile( HANDLE hFile, // handle to file to write to
LPCVOID lpBuffer, // pointer to data to write to file
DWORD nNumberOfBytesToWrite, // number of bytes to write
LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written
LPOVERLAPPED lpOverlapped // pointer to structure needed for overlapped I/O
);
hFile Long﹐一個檔案的句柄
lpBuffer Any﹐要寫入的一個數據緩衝區
nNumberOfBytesToWrite Long﹐要寫入數據的位元組數量。如寫入零位元組﹐表示什麼都不寫入﹐但會更新檔案的“上一次修改時間”。針對位於遠端系統的命名管路﹐限制在65535個位元組以內
lpNumberOfBytesWritten Long﹐實際寫入檔案的位元組數量
lpOverlapped OVERLAPPED﹐倘若在指定FILE_FLAG_OVERLAPPED的前提下打開檔案﹐這個參數就必須引用一個特殊的架構。那個架構定義了一次異步寫操作。否則﹐該參數應置為空(將宣告變為ByVal As Long﹐並傳遞零值)
|
XXX.
一般會員 發表:1 回覆:2 積分:0 註冊:2004-07-27 發送簡訊給我 |
|
ENIX007
高階會員 發表:28 回覆:274 積分:185 註冊:2003-11-27 發送簡訊給我 |
HANDLE hFile; HANDLE hAppend; DWORD dwBytesRead, dwBytesWritten, dwPos; char buff[4096]; // Open the existing file. 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 if (hFile == INVALID_HANDLE_VALUE) { ErrorHandler("Could not open ONE."); // process error } // Open the existing file, or if the file does not exist, // create a new file. 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 if (hAppend == INVALID_HANDLE_VALUE) { ErrorHandler("Could not open TWO."); // process error } // Append the first file to the end of the second file. // Lock the second file to prevent another process from // accessing it while writing to it. Unlock the // file when writing is finished. do { 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); // Close both files. CloseHandle(hFile); CloseHandle(hAppend);XXX.您好 這是小弟在MSDN上找到的範例,其中ONE.TXT必須已存在,執行後會將其內容寫入 TWO.TXT,而且是以Append的方式,我想重點是在紅色那行,也就是在寫之前先呼叫 SetFilePointer(),將檔案指標指到檔案結尾再進行寫入... 請參考看看 程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~
------
程式迷人之處,在於邏輯思考,然而卻也是惱人之處~~ |
andychang1690
資深會員 發表:20 回覆:694 積分:442 註冊:2003-03-14 發送簡訊給我 |
對不起使用 fopen() & fseek() 是否簡單一點 我試的一下 #include "stdio.h" void __fastcall TForm1::Button1Click(TObject *Sender) { FILE *file1; FILE *file2; AnsiString f_name="D:\\0000.txt"; AnsiString f_name2="D:\\1234.txt"; char msg[136]; file1=fopen(f_name.c_str(),"r"); file2=fopen(f_name2.c_str(),"a "); fseek(file1, 0, SEEK_SET); fseek(file2, 0, SEEK_END); while (!feof(file1)) { StrPCopy(msg,'\0'); fgets(msg, 136, file1); fprintf(file2,"%s" ,msg); } if (fclose(file1) != 0) fclose(file1); if (fclose(file2) != 0) fclose(file2); f_name="D:\\1111.txt"; file1=fopen(f_name.c_str(),"r"); file2=fopen(f_name2.c_str(),"a "); fseek(file1, 0, SEEK_SET); fseek(file2, 0, SEEK_END); while (!feof(file1)) { StrPCopy(msg,'\0'); fgets(msg, 136, file1); fprintf(file2,"%s" ,msg); } if (fclose(file1) != 0) fclose(file1); if (fclose(file2) != 0) fclose(file2); } 我試過符合xxx.的要求Andy Chang
------
Andy Chang |
XXX.
一般會員 發表:1 回覆:2 積分:0 註冊:2004-07-27 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |