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));
出来的书错误的数值
建议你看看 对象的持久化。