鱼C论坛

 找回密码
 立即注册
查看: 368|回复: 6

[已解决]Seek

[复制链接]
发表于 2023-7-28 14:48:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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开始覆盖  ?
最佳答案
2023-7-28 15:38:07
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在您的环境中的具体定义和文件的实际编码方式。
1111.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-28 14:49:04 | 显示全部楼层
问题分析:

在给出的代码中,使用了 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之后,先读取文件中的内容,然后再根据需要进行修改,最后再写入文件。或者使用其他方式来定位文件指针,确保不会覆盖文件中原有的内容。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 14:49:16 | 显示全部楼层
根据你提供的代码和注释,在调用Seek函数后,文件指针将被定位在距离文件开头5个TCHAR(每个TCHAR占用2个字节)的位置。然后,通过调用WriteString函数写入了字符串"888"。这意味着"888"将覆盖从文件指针位置开始的内容,而不是追加到文件末尾。

要追加到文件末尾而不覆盖现有内容,可以使用SeekToEnd函数将文件指针移动到文件末尾,然后再进行写入操作。你可以将以下代码替换到Seek函数和WriteString函数之间:
ULONGLONG n1 = mfile.SeekToEnd(); // 将文件指针移到末尾
mfile.WriteString(_T("888")); // 写入一行

这将确保新内容被添加到文件末尾,而不会覆盖现有内容。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-28 14:56:19 | 显示全部楼层
Mike_python小 发表于 2023-7-28 14:49
您在代码中使用Seek()函数将文件指针移动了10个字节,从而定位到了位置5(以字节为单位,从文件的开头计算 ...

n=10,表示指针位置在10,应该指向f  而不是e
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-28 14:57:09 | 显示全部楼层
isdkz 发表于 2023-7-28 14:49
问题分析:

在给出的代码中,使用了 mfile.Seek(5 * sizeof(TCHAR), CFile::begin) 函数来定位文件指针 ...

我的问题,指向f   为何从e开始覆盖 ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 15:38:07 | 显示全部楼层    本楼为最佳答案   
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在您的环境中的具体定义和文件的实际编码方式。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-29 03:59:05 | 显示全部楼层
isdkz 发表于 2023-7-28 15:38
由于在代码中,mfile.Seek(5 * sizeof(TCHAR), CFile::begin)移动了文件指针到文件开头偏 ...

我如何上传工程和文件     你看看问题在哪儿?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-26 13:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表