鱼C论坛

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

[已解决]CFile插入操作

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

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

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

x
        CStdioFile mfile;//创建文件对象
                
        BOOL b= mfile.Open(_T("D:\\测试.txt"), CFile::modeCreate| CFile::modeNoTruncate| CFile::modeReadWrite| CFile::typeUnicode,NULL);//打开文件
        
        if (!b) {
                AfxMessageBox(_T("文件打开失败"));
                return;
        }

        

        ULONGLONG n= mfile.Seek(5*sizeof(TCHAR), CFile::begin);//定位文件指针
        
        mfile.WriteString(_T("888"));//写入一行



        mfile.Close();//关闭文件


我的问题:文件指针不在末尾,这时WriteString是覆盖操作,  有没有像word的插入操作的函数  ?
最佳答案
2023-7-28 11:54:03
问题解答:

根据您的描述,如果文件指针不在末尾,想要实现插入操作可以使用CStdioFileWriteStringSeek函数结合使用。下面是修改后的代码示例:
CStdioFile mfile;BOOL b = mfile.Open(_T("D:\\测试.txt"), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite | CFile::typeUnicode, NULL);if (!b) {    AfxMessageBox(_T("文件打开失败"));    return;}ULONGLONG n = mfile.Seek(5 * sizeof(TCHAR), CFile::begin); // 定位到要插入的位置CString strContent;mfile.ReadString(strContent); // 读取插入位置后的内容mfile.Seek(5 * sizeof(TCHAR), CFile::begin); // 再次定位到要插入的位置CString strInsert = _T("888"); // 要插入的字符串mfile.WriteString(strInsert); // 插入字符串mfile.WriteString(strContent); // 写入之前读取的内容,实现插入操作mfile.Close();
在上述代码中,我们使用了两次Seek函数。第一次用于定位到要插入的位置,然后使用ReadString函数读取该位置后的内容。之后再次使用Seek函数回到要插入的位置,并使用WriteString函数插入新的字符串。最后使用WriteString函数将之前读取的内容写入文件,实现了插入操作。

请注意,这种方法仅适用于文本文件。如果您要处理的是二进制文件,请使用CFile类的WriteRead函数来进行插入操作。

希望这可以帮助到您!如果您有任何其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-28 11:53:46 | 显示全部楼层
在C++的MFC中,类似于Word的插入操作,可以使用CFile类的 Seek 函数将文件指针定位到要插入内容的位置,然后使用 Write 函数来实现插入操作。

要实现插入操作,首先需要将文件指针定位到要插入的位置,然后将后续内容先读入缓冲区,再写入插入的内容,最后再将缓冲区中的原内容写回文件。

以下是示例代码,演示了如何在文件指针位置插入内容:
CStdioFile mfile; // 创建文件对象

BOOL b = mfile.Open(_T("D:\\测试.txt"), CFile::modeCreate | CFile::modeReadWrite | CFile::typeUnicode, NULL); // 打开文件
if (!b) {
    AfxMessageBox(_T("文件打开失败"));
    return;
}

ULONGLONG n = mfile.Seek(5 * sizeof(TCHAR), CFile::begin); // 定位文件指针到插入位置

// 读取后续内容
CString strRemainingContent;
mfile.ReadString(strRemainingContent);

// 将文件指针回到插入位置
mfile.Seek(5 * sizeof(TCHAR), CFile::begin);

// 插入新内容
mfile.WriteString(_T("888"));

// 将后续内容写回文件
mfile.WriteString(strRemainingContent);

mfile.Close(); // 关闭文件

在上面的代码中,我们使用 ReadString 函数将插入位置之后的内容读入 strRemainingContent 字符串中,然后再将文件指针定位回插入位置,插入新内容,最后再将后续内容写回文件。这样就实现了文件的插入操作。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 11:54:00 | 显示全部楼层
CFile类没有提供直接的插入操作函数,但你可以通过以下步骤实现在指定位置插入文本的效果:

1. 打开文件时使用CFile::modeNoTruncate标志,它会保留原有文件内容而不清空文件。
2. 使用CFile::Seek()方法将文件指针移动到你想要插入的位置。在你的例子中,它已经定位到了第5个字符的位置。
3. 读取从插入位置开始到文件末尾的数据,可以使用CFile::Read()方法来实现。
4. 使用CFile::Seek()方法将文件指针重新移动到插入位置。
5. 使用CFile::Write()方法将你想要插入的文本写入文件。
6. 使用CFile::Write()方法将之前读取的数据写回文件。
7. 关闭文件。

下面是修改后的代码示例:
CStdioFile mfile;
BOOL b = mfile.Open(_T("D:\\测试.txt"), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite | CFile::typeUnicode);
if (!b) {
    AfxMessageBox(_T("文件打开失败"));
    return;
}

ULONGLONG n = mfile.Seek(5 * sizeof(TCHAR), CFile::begin); // 定位文件指针

CString remainingData; // 保存插入位置之后的数据
TCHAR buffer[1024];
UINT bytesRead = mfile.Read(buffer, sizeof(buffer)); // 读取剩余数据
while (bytesRead > 0) {
    remainingData += CString(buffer, bytesRead / sizeof(TCHAR));
    bytesRead = mfile.Read(buffer, sizeof(buffer));
}

mfile.Seek(5 * sizeof(TCHAR), CFile::begin); // 将文件指针重新移动到插入位置

CString insertionText = _T("888"); // 插入的文本
mfile.Write(insertionText, insertionText.GetLength() * sizeof(TCHAR)); // 写入插入文本

if (!remainingData.IsEmpty()) {
    mfile.Write(remainingData, remainingData.GetLength() * sizeof(TCHAR)); // 写回剩余数据
}

mfile.Close(); // 关闭文件

这段代码将在第5个字符位置插入文本"888"。注意,这只是一个示例,并且假设文件内容可以完全放入内存。如果文件非常大,你可能需要分块读取和写入数据以避免内存问题。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 11:54:03 | 显示全部楼层    本楼为最佳答案   
问题解答:

根据您的描述,如果文件指针不在末尾,想要实现插入操作可以使用CStdioFileWriteStringSeek函数结合使用。下面是修改后的代码示例:
CStdioFile mfile;BOOL b = mfile.Open(_T("D:\\测试.txt"), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite | CFile::typeUnicode, NULL);if (!b) {    AfxMessageBox(_T("文件打开失败"));    return;}ULONGLONG n = mfile.Seek(5 * sizeof(TCHAR), CFile::begin); // 定位到要插入的位置CString strContent;mfile.ReadString(strContent); // 读取插入位置后的内容mfile.Seek(5 * sizeof(TCHAR), CFile::begin); // 再次定位到要插入的位置CString strInsert = _T("888"); // 要插入的字符串mfile.WriteString(strInsert); // 插入字符串mfile.WriteString(strContent); // 写入之前读取的内容,实现插入操作mfile.Close();
在上述代码中,我们使用了两次Seek函数。第一次用于定位到要插入的位置,然后使用ReadString函数读取该位置后的内容。之后再次使用Seek函数回到要插入的位置,并使用WriteString函数插入新的字符串。最后使用WriteString函数将之前读取的内容写入文件,实现了插入操作。

请注意,这种方法仅适用于文本文件。如果您要处理的是二进制文件,请使用CFile类的WriteRead函数来进行插入操作。

希望这可以帮助到您!如果您有任何其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 12:47:49 | 显示全部楼层
歌者文明清理员 发表于 2023-7-28 08:54
抵制 AI 回答问题,支持高质量人工回答


无意义灌水,已举报
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 16:42:54 | 显示全部楼层
歌者文明清理员 发表于 2023-7-28 13:03
使用AI作弊作回答+引战+不说是AI回答
已举报

你占下风
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-28 16:45:25 | 显示全部楼层
对于CStdioFile,没有直接的插入操作函数。其WriteString函数会直接覆盖当前文件指针所在的地方。

如果你要实现插入效果,可以先读取文件指针之后的所有内容,然后再写入你想要插入的内容,最后再写入你之前读取的内容。这样就可以实现插入的效果。

例如,你可以按照以下方式实现:
// 假设需要往位置n插入一行行内容"888"
ULONGLONG posN = mfile.Seek(n * sizeof(TCHAR), CFile::begin);
CString contentN; //用来保存位置n及之后的所有内容
CString tmpStr;
while(mfile.ReadString(tmpStr)) {
    contentN += tmpStr;
    contentN += _T("\n");
}
//再次将文件指针定位到位置n,并写入新的内容"888"以及原有内容
mfile.Seek(posN, CFile::begin);
mfile.WriteString(_T("888"));
mfile.WriteString(contentN);

楼主给个最佳答案呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-21 22:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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