全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2341
推到 Plurk!
推到 Facebook!

請教一下...關於寫入檔案的問題

尚未結案
XXX.
一般會員


發表:1
回覆:2
積分:0
註冊:2004-07-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-27 12:28:31 IP:220.130.xxx.xxx 未訂閱
請問一下~~~ 我使用CreateFile和WriteFile來開檔跟寫檔~~ 可是.......... 為什麼每次一開檔....... 之前檔案內的資料都不見了咧............ 有沒有辦法重複使用同一個檔~~ 但資料是一直寫下去~~ 而不會蓋掉之前的資料呢???? 是否有解決的辦法呢???? 3Q~~3Q~~~
zilch
中階會員


發表:5
回覆:87
積分:78
註冊:2002-09-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-27 12:53:51 IP:218.166.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-27 13:20:23 IP:220.130.xxx.xxx 未訂閱
謝謝你提供的資料喔~~~3Q~~3Q~~~< > 不過..............< > 我就是試過了它所以的參數設定......... 還是找不到方法...... 才問的....... 不管我怎麼設定........ 檔案內....總是只有最後一筆的資料啦~~~
ENIX007
高階會員


發表:28
回覆:274
積分:185
註冊:2003-11-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-29 09:16:01 IP:203.70.xxx.xxx 未訂閱
 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-29 10:43:12 IP:219.130.xxx.xxx 未訂閱
對不起使用
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-30 12:20:58 IP:220.130.xxx.xxx 未訂閱
3Q~~~3Q~~~~ 謝謝啦~~ 沒錯~~就是SetFilePointer的問題~~ENIX007謝謝啦~~~~ 也謝謝zilch和andychang1690喔~~~ 謝謝你們熱心的協助~~ 3Q~~3Q~~~
系統時間:2024-05-09 11:36:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!