文件读写-CArchive如何才能替换txt文件中的某一行?

问题描述

CArchive如何才能替换txt文件中的某一行?

我用CArchive进行文件的读写,现在想修改其中的某一行,于是我声明了两个CArchive
对象,基于同一个CFile对象,一个读,一个写。先从文件中读入,然后读入的数据是否
满足条件,若满足,则紧接着用另一个CArchive对象写入新数据,若不满足,则把原来
的数据再写回去。但是好像有问题,两个CArchive对象声明的时候,如果是store的在
前面,则可以添加,但是会直接添加到文件结尾,如果声明时load的那个在前面,则添
加了文件没有变化。请问为什么会这样呢?是因为缓冲区吗?另外请问各位大神可以怎样
解决这个问题呢?谢谢各位~

 void Modify::OnClickedIdbModify()
{
    // TODO: Add your control notification handler code here
    if (!m_mComp || !m_mEng || !m_mMath || !m_mGym || m_mName == "" || m_mSno == "" || m_mMajor == ""){
        MessageBox(_T("请先进行搜索再尝试更改!"), _T("错误"));
        return;
    }

    MessageBox(_T("您正尝试更改一名学生的信息!rn确认更改请单击'确定',否则请单击'取消'"),
        _T("警告"), MB_ICONEXCLAMATION | MB_OKCANCEL);

    UpdateData();

    CFile cf;
    if (!cf.Open(_T("D:\SIMS.txt"),
        CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite | CFile::typeBinary)){
#if def_DEBUG
        afxDump << "unable to open file" << "n";
        exit(1);
#endif
    }

    CArchive cas(&cf, CArchive::store);
    CArchive cal(&cf, CArchive::load);            //能否成功写入似乎与声明的顺序有关

    CString temp;
    CString sno;

    int flag = 1;
    while (flag){
        cal >> sno;
        cal.ReadString(temp);                    //先把这一行分两部分读入
        if (m_mSno == sno){                     //再判断读入的sno是否满足条件
            UpdateData();
            cas << sno << m_mName << m_mMajor << m_mComp << m_mMath << m_mEng << m_mGym;
            temp.Format(_T("rn"));
            cas << temp;
            flag = 0;                //若满足,则把对话框中新获得的数据在这一行覆盖原数据
        }
        else{                        //若不满足,则把刚刚读入的原数据重新写回去
            cas << sno;
            cas.WriteString(temp);
        }

    }                                 //继续下一行的读入与判断

    cas.Close();
    cal.Close();
    cf.Close();
}

各位大神帮帮忙,小弟初学MFC,想做一个修改文件中某行数据的功能。谢谢!

解决方案

文本文件替换一行没有什么高效的办法,因为不是二进制文件。如果文件大小不是很大(100万行以内),建议一次性读取到内存,然后再输出。

解决方案二:

只能全部读取文件,然后修改对应行的内容,再写回文件。

解决方案三:

如果允许的话,与其跟CArchive做斗争,还不如写一个临时文件呢。
打开两个文件,一个原始文件,一个临时文件,原始文件只读,临时文件只写。
不是这个id的行,直接写入临时文件,否则写入更新后的内容。
最后如果发生了修改,临时文件替换原始文件。

解决方案四:

修改对应行的内容,再写回文件。

时间: 2024-09-14 00:24:21

文件读写-CArchive如何才能替换txt文件中的某一行?的相关文章

文件读写-求救…c++怎么将一个txt文件里的汉字读写到另一个新建文件中?

问题描述 求救-c++怎么将一个txt文件里的汉字读写到另一个新建文件中? 中文要怎么读啊-都是乱码,一行中文 饴糖:耛糖,胶饴,读到:就停止了,而且前面读的是乱码 解决方案 信息从一个txt文件传输到另一个txt文件的过程.中间是用WAV文件来传送第一个文件的信息的二进制码.(在MATLAB中)读一个文件里的某个值,然后写到另外一个文件内. 解决方案二: 设置读写文件时的编码格式为utf8 解决方案三: 一个汉字占两个字节,所以,一次要读两个字节,然后再判断文件是否结束. 解决方案四: 置读写

c语言-C语言中A文件定义的文件指针,如何才能在B文件中也可以写入信息

问题描述 C语言中A文件定义的文件指针,如何才能在B文件中也可以写入信息 image.c和rtp.c都不是主函数,在image.c中定义了一个文件指针,但我想把rtp.c中的信息写入这个文件.简单就是在A文件中定义了一个指针文件,想把B文件中的信息写入指针文件.你可能问我为什么不直在B文件中定义,因为也要写入A文件中信息,像我之前写的运行时会提示rtp.c中的文件指针是未定义的标识符. 应该怎么写才是正确,麻烦知道的人给点指导,谢谢 解决方案 通过extern在rtp.c中声明该文件指针为外部指

求助!替换txt文件指定行内容出现问题。

问题描述 PublicSub替换指定行内容(路径AsString,内容AsString,行AsString)DimistrAsString=My.Computer.FileSystem.ReadAllText(路径)Dima()AsString=istr.Split(vbCrLf)DimbAsIntegera(行)=内容My.Computer.FileSystem.WriteAllText(路径,Join(a,vbCrLf),False)EndSub以上是我的程序,可以正常完成替换工作,但是在x

Python实现读取目录所有文件的文件名并保存到txt文件代码_python

代码: (使用os.listdir) 复制代码 代码如下: import os def ListFilesToTxt(dir,file,wildcard,recursion):     exts = wildcard.split(" ")     files = os.listdir(dir)     for name in files:         fullname=os.path.join(dir,name)         if(os.path.isdir(fullname)

操作-分高悬赏答案!!sql server 2008 r2中怎样存储txt文件?

问题描述 分高悬赏答案!!sql server 2008 r2中怎样存储txt文件? 客户要求将大量TXT文件原封不动存入sql数据库,使用pb开发程序,通过pb可以实现文件的下载和上传,目前的问题就是,怎么才能将txt文件存入数据库?有几种方法?那种方法最简单易实现?具体操作怎么来?分高悬赏 解决方案 简单得很,先用编辑软件把字段之间用ascii码的t分隔,也就是tab那个键按出来的空白. 然后复制到excel,数据就从文本变成了表格形式.然后excel里面有拼接函数 那就拼接成一个inser

Lua文件读写详解

  这篇文章主要介绍了Lua文件读写详解,本文讲解了文件读写的简单模型和完整模型,并给出了一个操作示例,需要的朋友可以参考下 lua里的文件读写模型来自C语言,分为完整模型(和C一样).简单模型. 1.简单模型 io.input([file]) 设置默认的输入文件,file为文件名(此时会以文本读入)或文件句柄(可以理解为把柄,有了把柄就可以找到文件),返回文件句柄. io.output([file]) 设置默认的输出文件,参数意义同上. io.close([file]) 关闭文件,不带参数关闭

PHP文件读写操作之文件写入教程

在PHP网站开发中,存储数据通常有两种方式,一种以文本文件方式存储,比如txt文件,一种是以数据库方式存储,比如Mysql,相对于数据库存储,文件存储并没有什么优势,但是文件读写操作在基本的PHP开发中还是时有使用,今天和大家分享如何利用PHP技术实现文件读写之文件写入操作教程,也算是对PHP文件读写操作的入门学习. 将数据写入文件的操作主要涉及三个步骤及部分文件操作函数如下: 1.打开文件(文件操作函数:fopen) 2.写入文件(文件操作函数:fwrite等) 3.关闭文件(文件操作函数:f

c语言-如何用C语言实现.txt文件中内容的添加

问题描述 如何用C语言实现.txt文件中内容的添加 问题,如何用C语言中append()函数实现5.9.13行的功能:依次将1.2.3写入到D盘ccc.txt中. void main(){ ............1 int a=4,b=2: ............2 if(a*b==8) ............3 { ............4 //将1写入D盘ccc.txt文件中 ............5 } ............6 if(a-b==2) ............7

android-关于Android文件读写的问题

问题描述 关于Android文件读写的问题 本人小白一枚,最近写了一个文件读写的demo,但在datadata包名 下生成的文件不是txt格式,却是这么个东东,所以想让各位大神看看问题在哪里 代码:public class MainActivity extends Activity { private EditText mfilename; private EditText mfilecontent; private Button msave; @Override protected void