lnhv013710
2019-05-15 02:05
采纳率: 96.7%
浏览 528

VS2010 MFC 只用CstdioFile 成员得话,如何替换,插入字符,

麻烦哪位高手帮我把文本文件中的5行中的“xxxxx”替换成“123456789123456789123456789”,不要覆盖下一行的文本。然后用@替换"123456789123456789123456789”中的第6位,然后将指针移到行尾。

急求实现代码,顺便解答一下我的代码后面注释得问题,谢谢。

我的基本思路是readstring读一行,替换或插入等处理当前行数据,再writestring写入文件(不能影响覆盖下一行),将指针移动到下一行,继续轮询读>处理>写。

不想把整个文件都放入数组处理后删除原来文件的再重生成新文件的方法。

刚才网友说:没法实现,总之,这个问题我多留几天,最后选最优的代码(包括删了文件再重写)

另外:我虽然是新手,但是目前为止我提的所有问题都会把分给网友,不管有没有解决问题,最后只要我觉的有帮助,就会把分给我的感觉最有帮忙的。非常感谢大家百忙中能抽时间解答我的疑惑。

更改前的文件
99999
99999
xxxxx
99999
99999

要求更改后的文件
99999
99999
12345@789123456789123456789
99999
99999

下面是我写的代码,在插入"123456789123456789123456789”后总是会覆盖下一行。

while(file.ReadString(strText))
{
int dwPosStart = (DWORD)file.GetPosition() - (_tcslen(strText) + _tcslen(_T("\r\n")));//当前的行头。

    if(strText.Find("xxxxx")>=0)  //判断当前行是否存在xxxxx
        {       
            file.Seek((dwPosStart), CFile::begin); //seek到行首  
            file.WriteString("123456789123456789123456789\r\n");    //从行头写入一串字符串,这里如何避免覆盖下一行?只覆盖当前行,指针如何返回行尾?
            file.Seek(dwPosStart+5, CFile::begin); //seek到行首+5的位置
            file.WriteString("@");   //将@行中插入代替6,
            CString strTest;
            //file.ReadString(strTest);//这里我想用readstring把指针移到行尾,但是反而把文件给改写了,为啥read能改文件数据?

            file.Close();
            break;
我的代码最后生成了这些,writestring和readstring连用后,readstring改变了文件内容!!!
99999
99999
12345@3456789123456789123456789
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • blownewbee 2019-05-15 09:18
    已采纳

    文本文件没有办法直接在文件里替换一个长度不同的内容,唯一的办法是全部读取到内存,修改,再写回去。
    代码这次就不写了,以免别人的回答更好,或者lz有需求的变更,那就白费力气了。

    点赞 评论
  • dabocaiqq 2019-05-15 11:15

    利用CStdioFile读写文件(逐行读取)
    CFile的派生类CStdioFile提供了对文件进行流式的操作功能。其中函数void CStdioFile::WriteString( LPCTSTR lpsz )写入一个字符串,需要给字符串lpsz的末尾加上换行标志”\r\n”;函数bool CStdioFile::ReadString(CString &rString )从文件中读取一行,如果文件未读完返回true,否则返回false。

      比如:写入文件的例子

      //创建文件

      CStdioFile file;

      file.Open("ts.txt",CFile::modeCreate|CFile::modeWrite);

      //写入文件

      CString str;

      str.Format("%s\r\n","hello!I am talkingmute!");(在末尾添加\r\n会导致写出来的文档修改后出现格式错乱,只能写\n)

      file.Seek(0,CFile::end);

      file.WriteString( str );

      //关闭文件

      file.Close();

      比如:读文件的例子

      CString strText = “”;

      CString szLine = “”;

      //打开文件

      CStdioFile file;

      file.Open("ts.txt",CFile::modeRead);

      //逐行读取字符串

      while( file.ReadString( szLine ) )

      {

      strText += szLine;

      }

      MessageBox(strText);

      //关闭文件

      file.Close();

    利用CStdioFile读写文件(逐行读取)
    CFile的派生类CStdioFile提供了对文件进行流式的操作功能。其中函数void CStdioFile::WriteString( LPCTSTR lpsz )写入一个字符串,需要给字符串lpsz的末尾加上换行标志”\r\n”;函数bool CStdioFile::ReadString(CString &rString )从文件中读取一行,如果文件未读完返回true,否则返回false。
    
      比如:写入文件的例子
    
      //创建文件
    
      CStdioFile file;
    
      file.Open("ts.txt",CFile::modeCreate|CFile::modeWrite);
    
      //写入文件
    
      CString str;
    
      str.Format("%s\r\n","hello!I am talkingmute!");(在末尾添加\r\n会导致写出来的文档修改后出现格式错乱,只能写\n)
    
      file.Seek(0,CFile::end);
    
      file.WriteString( str );
    
      //关闭文件
    
      file.Close();
    
      比如:读文件的例子
    
      CString strText = “”;
    
      CString szLine = “”;
    
      //打开文件
    
      CStdioFile file;
    
      file.Open("ts.txt",CFile::modeRead);
    
      //逐行读取字符串
    
      while( file.ReadString( szLine ) )
    
      {
    
      strText += szLine;
    
      }
    
      MessageBox(strText);
    
      //关闭文件
    
      file.Close();
    
    点赞 评论
  • 点赞 评论
  • 白色一大坨 2019-05-15 12:23

    想做到可以,但用CstdioFile就实现不了,如果是打开文件,判断为止,模拟键盘输出,想来是可行的

    点赞 评论

相关推荐 更多相似问题