lm68140318 发表于 2023-7-28 11:53:35

CFile插入操作

        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的插入操作的函数?

isdkz 发表于 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 字符串中,然后再将文件指针定位回插入位置,插入新内容,最后再将后续内容写回文件。这样就实现了文件的插入操作。

陶远航 发表于 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;
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"。注意,这只是一个示例,并且假设文件内容可以完全放入内存。如果文件非常大,你可能需要分块读取和写入数据以避免内存问题。
如果问题已经解决,请设置最佳答案

Mike_python小 发表于 2023-7-28 11:54:03

问题解答:

根据您的描述,如果文件指针不在末尾,想要实现插入操作可以使用CStdioFile的WriteString和Seek函数结合使用。下面是修改后的代码示例:


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类的Write和Read函数来进行插入操作。

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

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

Mike_python小 发表于 2023-7-28 12:47:49

歌者文明清理员 发表于 2023-7-28 08:54
抵制 AI 回答问题,支持高质量人工回答

无意义灌水,已举报

sfqxx 发表于 2023-7-28 16:42:54

歌者文明清理员 发表于 2023-7-28 13:03
使用AI作弊作回答+引战+不说是AI回答
已举报

你占下风

sfqxx 发表于 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);

楼主给个最佳答案呗{:10_254:}
页: [1]
查看完整版本: CFile插入操作