求助 :关于文件操作 出现一些小问题 帮忙看看

xinxin0998 2011-04-02 09:02:18
题目:1、创建文本文件”test.txt”,写入一段文字,文字内容来自另一个文本文件”text.txt”,将”text.txt”内容全部写入”test.txt”中,并在尾部写入“文件操作很有用!”,同时输出关键字“信息”出现的次数和文件中的存储位置。
如图所示


下面是我的答案
#include<stdio.h>
#include<stdlib.h>
#include<io.h>

void main()
{
FILE *fp2=NULL,*fp3=NULL,*PA=NULL,*fp1=NULL,*fp4=NULL;

char src[5],s[]="文件操作很有用";
int NUM=0,i=0,ID=-1,filelen=0,j=0;
char *pFileBuf=NULL;


fp1=fopen("text.txt","r+");
if(fp1==0)
{
printf("open file failure!\n");
return;
}

//求文件长度
ID = fileno(fp1);
filelen = filelength(ID);

//申请内存
pFileBuf =(char*)malloc(filelen);
if(pFileBuf == NULL)
{
printf("malloc memory failure!\n");
fclose(fp1);
return;
}
memset(pFileBuf, 0, filelen);
fread(pFileBuf, filelen, 1, fp1);
fclose(fp1);


//创建第二个文件
fp2=fopen("text1.txt","w+");


if(fp2==0)
{
printf("open file failure!\n");
free(pFileBuf);
return;
}
//把内容输入到第二个文件中去
fwrite(pFileBuf,filelen,1,fp2);
//把文件操作很有用输入到第二个文件中去//
fwrite(s,strlen(s),1,fp2);
fclose(fp2);
fp4 = fopen("file.txt","w+");
if(fp4==0)
{
printf("open file failure!\n");
free(pFileBuf);
return;
}
for(i=0;i<filelen;i++)
{
memset(src,0,5);
strncpy(src,(pFileBuf + 2*i) ,4);

if(strcmp(src,"信息")==0)
{
NUM++;
fprintf(fp4,"第%d次 %d\n",NUM,i);

}
}
free(pFileBuf);
fclose(fp4);




}


程序能够运行 也有结果 可是发现结果并不满意
因为他没有把所有的“信息”找出来
也就是说一共有4个信息 只找出来2个
但是我不知道问题出在哪里
哪为高手帮忙看看

下面是text.txt文件中的文字 不会上附件 所以只好粘贴在这里

传感器是人们获取信息的工具,传感器技术是现代信息技术(包括传感与控制技术、通信技术和计算机技术)的三大支柱之一。在一个现代信息处理系统中,我们如果将计算机比喻成人的大脑,通信电路比喻成人的神经系统,那么传感器则可比喻成人的感觉器官。显然做为感觉器官的传感器如果无法及时、准确地获取信息,整个信息系统的各种功能也就无从发挥而失去了意义。传感器在现代信息处理系统中扮演着不可替代的基石作用。

谢谢了~

...全文
115 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xinxin0998 2011-04-04
  • 打赏
  • 举报
回复
谢谢啦 ,问题解决了~
xinxin0998 2011-04-04
  • 打赏
  • 举报
回复
谢谢啦 ,问题解决了~
ljhhh0123 2011-04-03
  • 打赏
  • 举报
回复
一楼的说得对,二楼的有些片面,如下面的一行红字就会误判:
信息dddd菪畔ⅷddd
看我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<io.h>
#include<string.h> //记得加头文件

void main()
{
FILE *fp2,*fp3,*PA,*fp1,*fp4;
char src[5];
unsigned char data[16] = {
0xFF, 0xFE, 0x87, 0x65, 0xF6, 0x4E, 0xCD, 0x64, 0x5C, 0x4F, 0x88, 0x5F, 0x09, 0x67, 0x28, 0x75
};//"文件操作很有用"的unicode(little_endian)的内码.
int NUM=0,i=0,ID=-1,filelen=0,j=0;
unsigned short *pFileBuf;
fp1=fopen("text.txt","r+");
if (fp1==0)
{
printf("open file failure!\n");
return;
}

ID = fileno(fp1);
filelen = filelength(ID);

pFileBuf =(unsigned short*)malloc(filelen+1); //注意多分配一个字节的空间
if (pFileBuf == NULL)
{
printf("malloc memory failure!\n");
fclose(fp1);
return;
}
memset(pFileBuf, 0, filelen);
fread(pFileBuf, filelen, 1, fp1);
fclose(fp1);

fp2=fopen("text1.txt","w+");
if (fp2==0)
{
printf("open file failure!\n");
free(pFileBuf);
return;
}
fwrite(pFileBuf,filelen,1,fp2);
fwrite(data,sizeof(data),1,fp2);
fclose(fp2);
fp4 = fopen("file.txt","w+");
if (fp4==0)
{
printf("open file failure!\n");
free(pFileBuf);
return;
}
printf("filelen=%d",filelen);

filelen = filelen/2-1;

for (i=0; i<filelen; i+=1)
{
if (pFileBuf[i] == 0x4fe1 && pFileBuf[i+1] == 0x606f)
{ //上面这两个数分别是'信'和'息'的unicode little_endin的内码.
NUM++;
fprintf(fp4,"第%d次 %d\n",NUM,i);//如果统一编码,这个也得改.
}
}

free((void*)pFileBuf);
fclose(fp4);
}
//本代码使用tiny c compiler 0.9.25 for windows xp 编译通过

只有统一编码才能提高汉字信息检索能力.
xinxin0998 2011-04-03
  • 打赏
  • 举报
回复
谢谢啦 ,问题解决了~
ljhhh0123 2011-04-02
  • 打赏
  • 举报
回复
这涉及到汉字的编码问题,我的做法是,把你的文本用记事本保存成unicode编码。编程不要用字符串检索函数。
一次取2字节,直接存到unsigned short类型中,从头到尾比对,如果是"信"字,就看下个字是“息”字不,
是的话,就将计数加1,如果不是则继续往下找。
汉字编码类型挺多,windows默认支持ansi,显示汉字就是gbk编码,是可变长度编码。

关键是你要能准确的断字。
heartgoon2010 2011-04-02
  • 打赏
  • 举报
回复
好像没问题了,试试:
-------
#include<stdio.h>
#include<stdlib.h>
#include<io.h>
#include<string.h> //记得加头文件

void main()
{
FILE *fp2=NULL,*fp3=NULL,*PA=NULL,*fp1=NULL,*fp4=NULL;

char src[5],s[]="文件操作很有用";
int NUM=0,i=0,ID=-1,filelen=0,j=0;
char *pFileBuf=NULL;
fp1=fopen("text.txt","r+");
if(fp1==0)
{
printf("open file failure!\n");
return;
}

ID = fileno(fp1);
filelen = filelength(ID);

pFileBuf =(char*)malloc(filelen+1); //注意多分配一个字节的空间
if(pFileBuf == NULL)
{
printf("malloc memory failure!\n");
fclose(fp1);
return;
}
memset(pFileBuf, 0, filelen);
fread(pFileBuf, filelen, 1, fp1);
fclose(fp1);

fp2=fopen("text1.txt","w+");
if(fp2==0)
{
printf("open file failure!\n");
free(pFileBuf);
return;
}
fwrite(pFileBuf,filelen,1,fp2);
fwrite(s,strlen(s),1,fp2);
fclose(fp2);
fp4 = fopen("file.txt","w+");
if(fp4==0)
{
printf("open file failure!\n");
free(pFileBuf);
return;
}
for(i=0;i<filelen;i++)
{
memset(src,0,5);
strncpy(src,(pFileBuf + i) ,4); //防止文本只能够出现单个字节的字符,所以pFileBuf + i

if(strcmp(src,"信息")==0)
{
NUM++;
fprintf(fp4,"第%d次 %d\n",NUM,i);

}
}
free(pFileBuf);
fclose(fp4);
}
-------
luciferisnotsatan 2011-04-02
  • 打赏
  • 举报
回复
单步调试下

你这两个字两个字跑,"x信|息x"这样怎么办?

你可以一次把文件都读入char数组里,然后用strstr搜。strstr用法请查MSDN

69,371

社区成员

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

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