用C++怎样修改文件中的一个字符--期待大虾帮忙

pcliuguangtao 2010-07-01 11:53:35
最近在写一个程序,要用到修改一个txt文本里一个特定位置的字符,找了很久也没找到方法,有一个人说分开做:把该位置之前的字符放到另一个文件里,然后添加该字符,最后在添加剩余的字符。这样是不是太慢烦了,还浪费内存。所以,问一下大家有没有什么好的方法,小弟在这里请教了。麻烦大家了
...全文
743 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
光行天下 2013-03-23
  • 打赏
  • 举报
回复
我刚刚找到一个好例子。分享给大家
#include<iostream>
#include<fstream>
#include<string>
using namespace std;

int main()
{
 char str[50]="";
 int line=0;
 fstream fs("f:\\0.txt",ios::in|ios::out);
 do
 { 
	 fs.getline(str,50,'\n');
	 line++; }while(line<3);
	 int len=strlen(str);
	 int p=-1;
	 for(int i=0;i<len;i++)
	 {
		 char s0[4]="";
		 memcpy(s0,str+i,3);
		 if(!strcmp(s0,"123"))
			 p=i;
	 }
	 if(p>=0)
	 {
		 fs.seekp(p-len-2,ios::cur);
		 fs.write("111",3);
	 }
	 fs.close();
}

/*
比如一txt文件a.txt内容如下
babgh 12 af
agda 214 21
agb 123 baf
agb 123 baf

修改第三行的123为111,
注意3,4行一样,但第四行不能改 
1,用什么语句寻找到第3行第4个字符?
如果是第120行的第50个字符呢?
2,请给具体语句,不需要完整的程序,只需要对第3行更改的那部分。 
*/
npuhuxl 2010-07-02
  • 打赏
  • 举报
回复
以app方式打开文件,然后定位到修改位置,写入你想要的字符。
但这种方法只能替换相同长度的字符串
liutengfeigo 2010-07-02
  • 打赏
  • 举报
回复
计算机不是人脑,不会一下就找到那个要该的东西吧
pcliuguangtao 2010-07-02
  • 打赏
  • 举报
回复
在上面的代码中我用的是ios::app|ios::in);所以在我执行以后我添加的数据是追加到文件末尾了,并没有覆盖的我想要的那个地方,这说明应该是我的定位错误,还是ios::app搞得鬼?
pcliuguangtao 2010-07-02
  • 打赏
  • 举报
回复
谢谢大家的帮助,我把我的问题再补充一下:
template<class T> int BTreeNode<T>::SearchSonNodePos(T obj)const{//查找对应子节点的位置
//资料写入文件
fstream datafile("library.txt",ios::app|ios::in);
if(!datafile)
{cerr<<"日志文件打开失败!"<<endl;
exit(1);}
for(int i=0;i<m_vecData.size();i++){
if(obj==m_vecData[i]) //已存在的书总量和剩余量加1
{ cout<<"该书已存在于书库!将把该书总数和剩余量都增加"<<endl;
cout<<"原来总数和剩余量为:"<<m_vecData[i].Total<<" "<<m_vecData[i].Remain<<endl;
m_vecData[i].Total+=obj.Total;
m_vecData[i].Remain+=obj.Total;
int sum=2*sizeof(int)+2*sizeof(string)+4;
********datafile.seekp(sum*(i+1)-sizeof(int)-1);datafile<<m_vecData[i].Total;
cout<<"现在总数和剩余量为:"<<m_vecData[i].Total<<" "<<m_vecData[i].Remain<<endl;
return -1;
}
else{datafile<<obj.SN<<" "<<obj.Name<<" "<<obj.Author<<" "<<obj.Total<<endl;}

if(obj<m_vecData[i]) return i;
}
就在****的位置是我的文件指针定位语句,在这里还想请问大家,在文件里有个文件指针,随着文件的读取会自动下移,不知道在文件里指针的位置是以0开头,以字节为单位,依次增加的吧?不会是按行列坐标来定位的吧?这是小弟新的疑惑,如有那位大虾知道答案,请告诉小弟您是从哪里知道的或是从哪本书上看到的,小弟感激不尽!
jd_wh 2010-07-02
  • 打赏
  • 举报
回复
你要修改的的是:source="……",修改为:des="……":
1:如果字符串des的长度等于source的长度,那可以直接将文件读写指针定位到source位置,直接写入des就可以了,这样就把source覆盖,起到了修改的目的
2:如果des的长度小于source的长度,需要将des用空格补齐为source的长度,然后形成的des串为: des+" ",然后就和方式1一样了
3:如果des的长度大于source的长度,这时候是不能采用方式1和2的,因为这时候写入会覆盖source之后的内容,对文件造成破坏,这种情况下只能是读取source之前的内容写入新文件,然后写入des的内容,然后再写入source之后的内容
iihero 2010-07-02
  • 打赏
  • 举报
回复
如果只是想替换某一特殊的字符,并且预先知道它的位置,也就是说这个文本文件前后大小都一样,那完全使用"r+"(读写)方式打开,
直接setpos到该位置,fwrite()写入新的字符值。
djjlove_2008 2010-07-02
  • 打赏
  • 举报
回复
首先把文件指针定位到该处,然后覆盖就行了吧。没必要那么麻烦。
jixingzhong 2010-07-02
  • 打赏
  • 举报
回复
如果修改前的内容和修改后的内容字节数一样,可以直接覆盖修改:
找到位置后,直接写入新的内容即可。
pcliuguangtao 2010-07-02
  • 打赏
  • 举报
回复
我自己总结了一下,写了篇文章,大家有兴趣可以看看
http://blog.csdn.net/pcliuguangtao/archive/2010/07/02/5709717.aspx
jd_wh 2010-07-02
  • 打赏
  • 举报
回复
CFile::begin \ CFile::end \ CFile::current 标志不同的位置,文件的起始位置、文件结束位置、文件指针当前位置,字节为单位。
wuliangyue7 2010-07-02
  • 打赏
  • 举报
回复
回复马克 居然说太短了 靠!
「已注销」 2010-07-01
  • 打赏
  • 举报
回复
没有办法,如果不涉及通过驱动对磁盘操作的话,只能这样。

65,183

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧