马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
CStdioFile mfile; // 创建文件对象
BOOL b = mfile.Open(_T("D:\\测试.txt"), CFile::modeNoTruncate|CFile::modeCreate | CFile::modeReadWrite | CFile::typeUnicode, NULL); // 打开文件
if (!b) {
AfxMessageBox(_T("文件打开失败"));
return;
}
//ULONGLONG n1=mfile.SeekToEnd();//文件指针移到末尾
//返回值:文件的长度(以字节为单位)
//mfile.SeekToBegin();//文件指针移到0位置
ULONGLONG n = mfile.Seek(5 * sizeof(TCHAR), CFile::begin);//定位文件指针
/*
打开文件时,文件指针将定位在 0 位置,即文件的开头
参数1:LONGLONG lOff 要将文件指针移动的字节数
如果使用正值,则将文件指针移向文件的末尾;如果使用负值,则将文件指针移向文件的开头
参数2:UINT nFrom 要在其中进行查找的位置
CFile::begin 从文件的开头查找
CFile::current 从文件指针的当前位置查找
CFile::end 从文件的末尾查找
返回值:如果该方法成功,则返回文件指针的位置;
否则返回未定义的值,以及指向引发的 CFileException 异常的指针
*/
mfile.WriteString(_T("888"));//写入一行
mfile.Close(); // 关闭文件
我的问题:
Seek函数返回指针位置是10,指针移动10字节,文件指针应该指向f ,为何从e开始覆盖 ?
由于在代码中,mfile.Seek(5 * sizeof(TCHAR), CFile::begin)移动了文件指针到文件开头偏移5个TCHAR的位置。如果考虑到每个TCHAR在Unicode格式下占用2个字节,那么这实际上是移动了10个字节。
如果我们以0开始计数,字符'f'在文件中是在10个字节的位置('f'的索引是5,但由于每个字符占2个字节,所以字节位置是5 * 2 = 10)。文件指针将被定位在第10个字节的位置,即'f'的位置。
然而,当我们在此位置上写入新内容"888"时,会从文件指针当前指向的位置开始写入,即从'f'开始写入,覆盖原有内容。
那么为什么看起来是从'e'开始覆盖的呢?可能是因为在您的文件或环境中,Unicode字符的表示方式或者TCHAR的定义方式与预期不同。另一个可能的解释是文本编辑器或者阅读器在解析这个Unicode文件时发生了一些误解。请确保您的环境和文件都是使用标准的、期望的Unicode和TCHAR定义。
请注意,以上解释假定的TCHAR定义为Unicode字符,占用2个字节。实际上,TCHAR的具体长度依赖于编译时的设置,它可以在ANSI和Unicode之间切换。在一些设置中,TCHAR可能只占用一个字节,这可能也会影响文件指针的定位和数据的覆盖。为了确保预期的行为,应该仔细检查TCHAR在您的环境中的具体定义和文件的实际编码方式。
|