1. MFC CFile寫文件問題
我也不喜歡用CFile,給你一段類似的代碼,你稍微改下就可以了
.......
{
FILE * fp;
CString filename="out.dat";
fp=fopen(filename,"a");
for (int i=0;i<5;i++)
{
fprintf(fp,"%d ",i);
}
fprintf(fp," ");
fclose(fp);
}
......
每次寫文件不會擦除之前的數據,就是說這個程序你運行3次,得到.dat文件里的結果
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
2. CFile怎樣判斷是否讀到文件結束了
1,先獲取內容長度,在搜索\r\n得到最後一行位置,在把指針調整到那裡。
2,讀文件版是有個文件指針,調用權Read時文件指針制動向前移動。
3,下次再調用是是接著上次文件指針讀。mile.Read(sRead,2),第二個參數指定了最多讀幾個字元,自己指定了讀兩個字元。例如,
CFile fr;
...//打開文件
char readbuf[65535];
int n;
while((n = fr.Read(readbuf, 65535)) > 0)//讀文件的長度大於0,說明文件沒有結束,否則已經結束了
{
//操作
}
3. 使用CFile類讀取文件如何判斷文件結束
如果是用二進制方式讀取,那存放的緩沖應該用char類型或者Byte類型,你用unsigned short int類型肯定不回行啊,等讀取好了答後,要對這個緩沖進行解析,按照已知的位元組存放方式,將這個緩沖中的數據放到相應的類型中,這樣才能得到人看的懂的東西啊,這中間要用到位操作運算,比如第238位元組到第241位元組中放的是一個整型數據,那你就要先將238位元組中的數據賦給一個int,然後對int左移8位,然後將239中數據和int這個變數做或操作,這樣相當於int中有兩個位元組數據了,一次類推,直到把四個位元組數據都放進int型變數,這樣輸出這個int才是人看的懂的
4. VC寫文件
方法1:
try{
CFile f;
f.Open("D:/test.txt",CFile::modeWrite);
// char myBuf[1024]={'1','2','3','4'};//初始化4個
//memset(myBuf, '0', sizeof(txtBuf));
f.SeekToEnd();//用來標注寫入位置在最後 即在末尾寫入不覆蓋原有內容
// f.Write(&myBuf,4);//sizeof(myBuf)或1024或大於4會出現許多空格
f.Write("the end",sizeof("the end"));
f.Flush();
f.Close();
}catch(...){
MessageBox("未成功寫入");
}
方法2:使用CStdioFile CStdioFile 為CFile子類故可使用CFile所有方法
CStdioFile sf;
CString str="abcdef12345gg";
sf.Open("D:/test.txt",CFile::modeWrite);
sf.SeekToEnd();
sf.WriteString("1234567890");//CStdioFile 的方法
sf.Flush();
sf.Close();
備註:1:方法2 未加try catch 建議加上
2:方法1 先不要理開頭有//的行,那是我用來測試的
3: c++兼容c 可以試一試fopen fwrite等方法
本以為很簡單,有點高估自己啦,自己反倒學了不少知識
5. 怎麼在文件末尾寫數據我用CFile::SeekToEnd好像不行。
打開文件的方式中,有一種是在文件尾,寫新的數據
-------------------------------
MFC的話,你看是不是用這個
CFile::modeNoTruncate Combine this value with modeCreate. If the file being created already exists, it is not truncated to 0 length. Furthermore, if the file being created already exists, the underlying file pointer will point to the beginning of the file. This flag guarantees the file to open, either as a newly created file or as an existing file. This might be useful, for example, when opening a settings file that may or may not exist already. This option applies to CStdioFile as well.
6. MFC 的 CFile 文件讀寫
read讀取後文件指針移動是因為read內部實現的,你沒必要糾結,如果你只是要實現文件的分隔加合並,不需要分析文件內容,那應該很簡單,在打開文件時加上CFile::typeBinary 模式
7. C語言裡面的二進制文件的結束標志是什麼
1、可以使用feof函數來判斷二進制文件是否結束。
EOF是文本文件結束的標志。在文本文件中,數據是以字元的ASCⅡ代碼值的形式存放,普通字元的ASCⅡ代碼的范圍是32到127(十進制),EOF的16進制代碼為0xFF(十進制為-1),因此可以用EOF作為文件結束標志。當把數據以二進制形式存放到文件中時,就會有-1值的出現,因此不能採用EOF作為二進制文件的結束標志。為解決這一個問題,ASCI C提供一個feof函數,用來判斷文件是否結束。feof函數既可用以判斷二進制文件又可用以判斷文本文件。
2、常式:
#include<stdio.h>
intmain(void)
{
FILE*stream;
/*openafileforreading*/
stream=fopen("DUMMY.FIL","r");
/*readacharacterfromthefile*/
fgetc(stream);
/*checkforEOF*/
if(feof(stream))//使用feof函數檢查是否到達文件末尾
printf("Wehavereachedendoffile ");
/*closethefile*/
fclose(stream);
return0;
}
8. Cfile如何使用
文件讀寫的最普通的方法是直接使用CFile進行,如文件的讀寫可以使用下面的方法:
//對文件進行讀操作
char sRead[2];
CFile mFile(_T("user.txt"),CFile::modeRead);
if(mFile.GetLength()<2)
return;
mFile.Read(sRead,2);
mFile.Close();
//對文件進行寫操作
CFile mFile(_T("user.txt "), CFile::modeWrite|CFile::modeCreate);
mFile.Write(sRead,2);
mFile.Flush();
mFile.Close();
如果你要進行的文件操作只是簡單的讀寫整行的字元串,建議你使用CStdioFile,用它來進行此類操作非常方便,如下例。
CStdioFile mFile;
CFileException mExcept;
mFile.Open( "d:\\temp\\aa.bat", CFile::modeWrite, &mExcept);
CString string="I am a string.";
mFile.WriteString(string);
mFile.Close();
9. 如何判斷寫文件結束
這個問題太好解決了,有幾種方法
方法1,使用windows.h里的全局共享Mutex
如果是在windows裡面可以用創建Mutex的方法
即,第一個發送進程開始時就建立一個Mutex
然後開始寫文件,寫完文件然後刪除掉Mutex.
第二個進程一直創建一個和第一個進程相同的Mutex,由於是同名,肯定是創建失敗。如果失敗繼續嘗試並等待直到第一個進程刪除Mutex,則二號進程創建成功,就可以打開文件並發送了.
方法2 更簡單,加一個標志文件S,即第一個進程開始讀文件讀完文件後,創建一個特別的文件叫"c:\sign.txt".只要創建即可,不用寫任何東西.
進程二,一直嘗試打開"c:\sign.txt"由於文件不存在,則必定打開失敗.直到進程一完成工作,創建了 c:\sign.txt
.進程二才能打開成功,則意味著進程二可以發送文件了.
我的例子是用C++ 標准流fstream寫的.你也可以用c的
File 一樣來完成
方法1代碼:
進程1
#incle <windows.h>
int main()
{
HANDLE m_Mutex=CreateMutex(NULL, FALSE, "is_ok");
//寫文件..... 你的代碼
CloseHandle(m_Mutex);//刪除Mutex is_ok;
return 0;
}
進程2
#incle<windows.h>
int main()
{
do {
HANDLE m_Mutex=CreateMutex(NULL, FALSE, "is_ok");
Sleep (5000); //每5秒檢測一次
}while(GetLastError() == ERROR_ALREADY_EXISTS);
CloseHandle(m_Mutex);
//如果程序能執行到這里,代表進程一已經寫完文件了
//進程二,你的代碼寫在這里.
return 0;
}
10. CFile讀寫二進制文件的問題
|debug調試看錯在復哪一制步
CFile file;
file.Open(L"gamelist.dat",CFile::typeBinary|CFile::modeRead|CFile::shareDenyNone|CFile::modeNoTruncate|CFile::modeCreate);
Game g;
file.Read(&g,sizeof(Game));
file.Close();
CString temp;
temp.Empty();
temp=g.name[0];
MessageBox(temp);
file.Read(&g,sizeof(Game));
出來的書錯誤的數值
建議你看看 對象的持久化。