Seek
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) 函数来定位文件指针。根据代码注释中的解释,这个函数的第一个参数是要将文件指针移动的字节数,如果使用正值,则将文件指针移向文件的末尾;如果使用负值,则将文件指针移向文件的开头。第二个参数是要在其中进行查找的位置,可以是 CFile::begin (文件开头)、 CFile::current (当前文件指针位置)或 CFile::end (文件末尾)。
代码中的 mfile.Seek(5 * sizeof(TCHAR), CFile::begin) 指定将文件指针向文件开头偏移5个 TCHAR 的字节数。假设文件内容如下:
abcdefghij
文件指针起初指向'a'的位置(偏移为0)。使用 mfile.Seek(5 * sizeof(TCHAR), CFile::begin) 将文件指针移动到 f 的位置(偏移为5)。然后使用 mfile.WriteString(_T("888")) 写入字符串"888"。
由于文件以Unicode格式打开( CFile::typeUnicode ),每个 TCHAR 占据2个字节,所以"888"会覆盖掉原始文件中的一部分内容。
回答:
在给定的代码中,Seek函数移动文件指针到文件开头偏移5个TCHAR字节的位置。然后,通过 mfile.WriteString(_T("888")) 写入了字符串"888"。由于文件以Unicode格式打开,每个TCHAR占据2个字节,因此字符串"888"会覆盖掉原始文件中的内容,从f开始覆盖。
要避免这种问题,您可以在调用Seek之后,先读取文件中的内容,然后再根据需要进行修改,最后再写入文件。或者使用其他方式来定位文件指针,确保不会覆盖文件中原有的内容。 根据你提供的代码和注释,在调用Seek函数后,文件指针将被定位在距离文件开头5个TCHAR(每个TCHAR占用2个字节)的位置。然后,通过调用WriteString函数写入了字符串"888"。这意味着"888"将覆盖从文件指针位置开始的内容,而不是追加到文件末尾。
要追加到文件末尾而不覆盖现有内容,可以使用SeekToEnd函数将文件指针移动到文件末尾,然后再进行写入操作。你可以将以下代码替换到Seek函数和WriteString函数之间:
ULONGLONG n1 = mfile.SeekToEnd(); // 将文件指针移到末尾
mfile.WriteString(_T("888")); // 写入一行
这将确保新内容被添加到文件末尾,而不会覆盖现有内容。
如果问题已经解决,请设置最佳答案 Mike_python小 发表于 2023-7-28 14:49
您在代码中使用Seek()函数将文件指针移动了10个字节,从而定位到了位置5(以字节为单位,从文件的开头计算 ...
n=10,表示指针位置在10,应该指向f而不是e isdkz 发表于 2023-7-28 14:49
问题分析:
在给出的代码中,使用了 mfile.Seek(5 * sizeof(TCHAR), CFile::begin) 函数来定位文件指针 ...
我的问题,指向f 为何从e开始覆盖 ? lm68140318 发表于 2023-7-28 14:57
我的问题,指向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在您的环境中的具体定义和文件的实际编码方式。 isdkz 发表于 2023-7-28 15:38
由于在代码中,mfile.Seek(5 * sizeof(TCHAR), CFile::begin)移动了文件指针到文件开头偏 ...
我如何上传工程和文件 你看看问题在哪儿?
页:
[1]