紧急求助!在线等待!文件中搜索的问题!

Iambear 2002-05-23 12:57:38
各位我写了段小程序,其中要打开一个指定文件,并且从中搜索是否存在指定的字符串,并且用另一给定字符串替换。
我不知道在C或C++中用什么函数?或者如何实现?
谢谢!
由于一小时内要用,我一直在线等待!
...全文
31 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
Iambear 2002-05-27
  • 打赏
  • 举报
回复
to fang_jb(小方) :
或其他知道的朋友:
我用了一个从一个字符串中删除另一个子字符串的函数,
但在Unix下编译时,报错:error: identifier redeclared: strstr_rem
函数如下,能帮我看看!
谢谢!

char *strstr_rem(char *fstring, char *substring)
//Delete substring from string
{
int i,j,k,loc=-1;
char *original = fstring;

for (i=0;fstring[i]&&(loc==-1);i++)
for (j=i, k=0; fstring[j]==substring[k]; j++,k++)
if (! substring[k+1])
loc =i;
if (loc != -1) //substring was found
{
for (k=0; substring[k]; k++)
for (j=loc, i= loc+k; fstring[i]; j++,i++)
fstring[j] = fstring[i];
fstring[i]==NULL;
}

return(original);
}
Iambear 2002-05-27
  • 打赏
  • 举报
回复
to fang_jb(小方) :
或其他知道的朋友:
我用了一个从一个字符串中删除另一个子字符串的函数,
但在Unix下编译时,报错:error: identifier redeclared: strstr_rem
函数如下,能帮我看看!
谢谢!

char *strstr_rem(char *fstring, char *substring)
//Delete substring from string
{
int i,j,k,loc=-1;
char *original = fstring;

for (i=0;fstring[i]&&(loc==-1);i++)
for (j=i, k=0; fstring[j]==substring[k]; j++,k++)
if (! substring[k+1])
loc =i;
if (loc != -1) //substring was found
{
for (k=0; substring[k]; k++)
for (j=loc, i= loc+k; fstring[i]; j++,i++)
fstring[j] = fstring[i];
fstring[i]==NULL;
}

return(original);
}
Iambear 2002-05-24
  • 打赏
  • 举报
回复
wsjdouble(废墟) :
能给我一个具体的例子吗?
例如,在文件test.txt中查找字符串abcd 。
谢谢!
Iambear 2002-05-24
  • 打赏
  • 举报
回复
Elkel() 、fang_jb(小方)、wsjdouble(废墟)、 yejin13(Ring Yee)、zhang1000(多一个零)、aprim(四楞子) 以上跟贴的各位朋友,先去这里拿分,这个贴子等我把这个问题彻底弄清楚再给大家加分!
http://www.csdn.net/expert/topic/745/745937.xml?temp=.3179895
fang_jb 2002-05-24
  • 打赏
  • 举报
回复
while(1) {
n = fread(buff,1,sizeof(buff),fpr);//读文件,n是返回读到的字节数
if(n==0)
break;
else {
while(1) {
ptr = strstr(buff,"abcd");//找第一个abcd,ptr此时指向第一个abcd
if(ptr==NULL) {//没找到,
fwrite(buff,1,strlen(buff),fpw);//把buff的所有内容写到ans文件中
memset(buff,0,sizeof(buff));
break;//已经完全读完,可以结束
}
else {
strcpy(p,ptr);//把ptr的内容赋给p
if(strlen(buff)!=strlen(p))//p和buff不相同,即ptr不是指向buff的第一位
fwrite(buff,1,strlen(buff)-strlen(p),fpw);//往文件里写
fwrite("xx",1,strlen("xx"),fpw);//写一个替换的内容,
memset(buff,0,sizeof(buff));
for(n=0;n<strlen(p);n++)
buff[n] = p[n+strlen(argv[2])];//把剩下的字符串去掉abcd赋给buff,开始下一次的查找替换
buff[n] = '\0';
}
memset(p,0,sizeof(p));
}
}
}

说的不是很清楚,自己想想就明白了
思想就是找到一个abcd,把buff前面的内容写到另一个文件,
然后把替换的内容写进去,然后再把buff的原有内容去掉前面几个
已经写到文件中的字符,再把abcd去掉,赋回给buff,以便循环

考核???
fang_jb 2002-05-24
  • 打赏
  • 举报
回复
考核?
Iambear 2002-05-24
  • 打赏
  • 举报
回复
to fang_jb(小方) :
能帮我把你写的这段程序里的那个大循环主要语句注释一下吗?
不好意思,要求有点过分!呵呵呵
我考核就要开始了,等考核完成,一定高分相赠!
谢谢!
Iambear 2002-05-24
  • 打赏
  • 举报
回复
to fang_jb(小方) :
你能帮我把大循环里的都简单注释一下吗?
不好意思,要求有点过分。
我一会儿就要考核了!考核完了,一定高分相赠!
谢谢!
fang_jb 2002-05-24
  • 打赏
  • 举报
回复
呵呵,req就是源文件,ans就是最后生成的文件。
我的代码里还少了最后的删除req,把ans名字该成req。
这样就实现替换了。
Iambear 2002-05-24
  • 打赏
  • 举报
回复
to fang_jb(小方) :
这里
fpr = fopen("req","r");
fpw = fopen("ans","w");
“req”“ans”各指的是什么文件?哪一个是我要做替换操作的文件?
fang_jb 2002-05-24
  • 打赏
  • 举报
回复
abcd是要找的,xx是替换的
fang_jb 2002-05-24
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char buff[1024];
char p[1024],*ptr;
FILE* fpr,*fpw;
int n=0;

memset(buff,0,sizeof(buff));
memset(p,0,sizeof(p));
fpr = fopen("req","r");
fpw = fopen("ans","w");
if(fpr==NULL||fpw==NULL)
return -1;
while(1) {
n = fread(buff,1,sizeof(buff),fpr);
if(n==0)
break;
else {
while(1) {
ptr = strstr(buff,"abcd");
if(ptr==NULL) {
fwrite(buff,1,strlen(buff),fpw);
memset(buff,0,sizeof(buff));
break;
}
else {
strcpy(p,ptr);
if(strlen(buff)!=strlen(p))
fwrite(buff,1,strlen(buff)-strlen(p),fpw);
fwrite("xx",1,strlen("xx"),fpw);
memset(buff,0,sizeof(buff));
for(n=0;n<strlen(p);n++)
buff[n] = p[n+strlen("abcd")];
buff[n] = '\0';
}
memset(p,0,sizeof(p));
}
}
}
fclose(fpr);
fclose(fpw);
}

linux下编译测试通过
格式啦,安全啦,错误处理啦,都没有,自己看着办了
wsjdouble 2002-05-23
  • 打赏
  • 举报
回复
定义两个指针
使用读写方式打开文件
一个用于读文件,一个用于写文件。
先用渎指针,将文件读入内存,进行比较
每查找到一个相等的字符串
对写指针重新定位
然后用流写入文件;
循环就可以了;
fread(void *p,int size,int nitems,FILE *STREAM)
*P 指数据存入的内存缓冲区,
SIZE 指数据项的长度
nitems 指数据项数;
* stream 文件的指针
fwrite(void *p,int size,int nitems, file *stream)
*p指向的缓冲区中取出长度为size字节的nitems个数据项,写入到流指针stream指向的文件中,
每次些之前必须进行指针重新定位。
fseek(FILE*stream , long offset, int origin);
offset 偏移量
origin 指三种模式 SEEK_SET 指从文件头开始的
SEEK_CUR 指从指针的当前位置开始
SEEK_END 指从文件尾向前移动OFFSET个字节
Iambear 2002-05-23
  • 打赏
  • 举报
回复
我这样用fread对吗?
FILE *fp;
char cString;
int nSize;
if ((fp=fopen("msg.dat","r"))==NULL)
{
printf("FOPEN FILE ERROR\n");
return -1;
}

nSize = fseek(fp,0,2);

if (nSize <=0)
printf("local fail\n");
else
{
fseek(fp,0,0);
cSring = fread(fp,nSize);
}
fang_jb 2002-05-23
  • 打赏
  • 举报
回复
用fread读,一次全读进来
fang_jb 2002-05-23
  • 打赏
  • 举报
回复
用stat函数检查文件大小,
分配内存,读!
sigh,这东西的效率不必知道怎么样,
最好能找到linux的源码看,里面的实现应该比这个想法出色
Iambear 2002-05-23
  • 打赏
  • 举报
回复
谢谢 fang_jb(小方) !
那如何将文件完全读到内存中呢?
fang_jb 2002-05-23
  • 打赏
  • 举报
回复
vi中的实现,是把文件完全读到内存中,
然后把整块内存当作一个大的字符buffer来处理。
如果文件巨大,vi经常会报出一个tmpfile too large的错误。
因此,如果文件小,你可以参照着做,
如果文件大,只能写临时文件,一段一段的做,然后把临时文件保存回来了
具体的替换用strstr()可以实现的
Iambear 2002-05-23
  • 打赏
  • 举报
回复
to elkel() : strstr()是字符串中找字符串,不是文件中查找字符串!
Elkel 2002-05-23
  • 打赏
  • 举报
回复
你用C++吗,用string 缓存数据,用replace()
加载更多回复(8)

70,031

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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