鱼C论坛

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

[已解决]CFile插入操作

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

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

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

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

  9.        

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



  13.         mfile.Close();//关闭文件
复制代码



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

根据您的描述,如果文件指针不在末尾,想要实现插入操作可以使用CStdioFileWriteStringSeek函数结合使用。下面是修改后的代码示例:
  1. CStdioFile mfile;
  2. BOOL b = mfile.Open(_T("D:\\测试.txt"), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite | CFile::typeUnicode, NULL);
  3. if (!b) {
  4.     AfxMessageBox(_T("文件打开失败"));
  5.     return;
  6. }
  7. ULONGLONG n = mfile.Seek(5 * sizeof(TCHAR), CFile::begin); // 定位到要插入的位置
  8. CString strContent;
  9. mfile.ReadString(strContent); // 读取插入位置后的内容
  10. mfile.Seek(5 * sizeof(TCHAR), CFile::begin); // 再次定位到要插入的位置
  11. CString strInsert = _T("888"); // 要插入的字符串
  12. mfile.WriteString(strInsert); // 插入字符串
  13. mfile.WriteString(strContent); // 写入之前读取的内容,实现插入操作
  14. mfile.Close();
复制代码

在上述代码中,我们使用了两次Seek函数。第一次用于定位到要插入的位置,然后使用ReadString函数读取该位置后的内容。之后再次使用Seek函数回到要插入的位置,并使用WriteString函数插入新的字符串。最后使用WriteString函数将之前读取的内容写入文件,实现了插入操作。

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

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

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

使用道具 举报

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

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

以下是示例代码,演示了如何在文件指针位置插入内容:

  1. CStdioFile mfile; // 创建文件对象

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

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

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

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

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

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

  17. 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. 关闭文件。

下面是修改后的代码示例:

  1. CStdioFile mfile;
  2. BOOL b = mfile.Open(_T("D:\\测试.txt"), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite | CFile::typeUnicode);
  3. if (!b) {
  4.     AfxMessageBox(_T("文件打开失败"));
  5.     return;
  6. }

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

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

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

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

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

  21. mfile.Close(); // 关闭文件
复制代码


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

使用道具 举报

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

根据您的描述,如果文件指针不在末尾,想要实现插入操作可以使用CStdioFileWriteStringSeek函数结合使用。下面是修改后的代码示例:
  1. CStdioFile mfile;
  2. BOOL b = mfile.Open(_T("D:\\测试.txt"), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite | CFile::typeUnicode, NULL);
  3. if (!b) {
  4.     AfxMessageBox(_T("文件打开失败"));
  5.     return;
  6. }
  7. ULONGLONG n = mfile.Seek(5 * sizeof(TCHAR), CFile::begin); // 定位到要插入的位置
  8. CString strContent;
  9. mfile.ReadString(strContent); // 读取插入位置后的内容
  10. mfile.Seek(5 * sizeof(TCHAR), CFile::begin); // 再次定位到要插入的位置
  11. CString strInsert = _T("888"); // 要插入的字符串
  12. mfile.WriteString(strInsert); // 插入字符串
  13. mfile.WriteString(strContent); // 写入之前读取的内容,实现插入操作
  14. 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函数会直接覆盖当前文件指针所在的地方。

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

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


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 02:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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