修改文件内容后 feof函数可以用吗? 大概是在文件里先写了许多个相同的结构

fread读取结构体注意事项 - 推酷
fread读取结构体注意事项
实际读取的元素个数.如果返回值与
不相同,则可能文件结尾或发生错误.
从ferror和feof获取错误信息或检测是否到达文件结尾.
C的文本读写和二进制读写:
C的文本方读写与二进制读写的差别仅仅体现在回车换行符的处理上.
文本方式写时,每遇到一个'
'(0AH换行符),它将其换成'
'(0D0AH,回车换行),然后再写入文件;当文本读取时,它每遇到一个'
'将其反变化为'
',然后送到读缓冲区.二进制读写时,其不存在任何转换,直接将写缓冲区中数据写入文件.
参考文章:
JianKun的博客
,文本文件与二进制文件区别,
那么,如果我们要用fread()来读取文本文件呢?下面我们来试一下:
新建一个.txt文件,命名为&f1.txt&,然后在里面输入如下内容:
注意上图中的光标位置,我们在最后一行也添加了一个回车~~~
在面我们来看一下文件大小:48字节
咦,为什么会是48个字节呢?上面的文件中明明只有42个字符啊。这里就牵涉到windows记事本中的换行问题了:
&记事本中是用'\r\n'来实现换行的,并且在记事本中不显示出来&
哦!这下子明白了,原来我们敲了3个换行符。3*2 = 6 ,而6+42 = 48 刚刚好!!!
(当然,你也可以自己试一下,新建一个&.txt&文件,在里面输入&123&然后保存,查看一下txt属性,这时候大小为3字节
然后你再打开txt在里面输入一个回车,保存,再查看一下属性,是不是变成5字节了?)
额,下面我们来实现以下读取文件,然后根据文件中的 第二列 中的字符串大小对 记事本中的行进行排序~~~
我们先构思一下要如何读取文件行,很简单,弄一个结构体:
typedef struct node
char a[4];
char b[8];
char c[4];
char a[4] :存放&123 & &(123后面还有一个空格也存放在a[]里面)
char b[8] &:存放&kbcdefg&& (一直到20前面)
char c[4] &:存放&20\r\n& &(这里是要注意的)&
另外还牵涉到一个问题,就是非字符串如何比较大小?这里引入了strncmp()函数。
#include &stdio.h&
#include &sys/types.h&
#include &sys/stat.h&
#include &malloc.h&
#include &string.h&
typedef struct node
char a[4];
char b[8];
char c[4];
int main()
FILE *fp1 = NULL, *fp2 = NULL;
int i,j,n = 0;
LNode *fbuf = NULL,
fp1 = fopen(&f1.txt&,&rb&);
fp2 = fopen(&f2.txt&,&wb&);
_stat(&f1.txt&,&buf);
//buf.st_size
n = buf.st_size/(sizeof(LNode));
//获得文件行数
fbuf = (LNode *)malloc(buf.st_size);
for (i = 0; i & ++i)
fread(&fbuf[i],sizeof(LNode),1,fp1);
for (i = 1; i & ++i)
for (j = 0; j & n-i; ++j)
//按照b排序
if (strncmp(fbuf[j].b,fbuf[j+1].b,7) & 0)
t = fbuf[j];
fbuf[j] = fbuf[j+1];
fbuf[j+1] =
for (i = 0; i & ++i)
fwrite(&fbuf[i],sizeof(LNode),1,fp2);
fclose(fp1);
fclose(fp2);
如果你 strcut _stat结构体看不懂的话,参见这里:C语言中如何获得文件大小,
如下图,排好序的&f2.txt&:
当然,上面的结构体里面定义的全部是char类型的成员,不涉及结构体的字节对齐问题。
如果牵涉到结构体的字节对齐问题,可能操作起来会更加复杂。
如果不是必要,请不要用fread()函数读取文本文件。&
fscanf(),fgets(),fgetc()等函数都能很好的读取文本文件。
如果你想了解结构体的字节对齐情况,你可以参见:结构体在内存中所占字节大小计算,
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致> 文件的合并与分离(FILE*)问题:如果你想把一个或多个文件流写入一个文件中,并能实现回放的功能,
文件的合并与分离(FILE*)问题:如果你想把一个或多个文件流写入一个文件中,并能实现回放的功能,
gtoboy & &
发布时间: & &
浏览:1 & &
回复:0 & &
悬赏:0.0希赛币
文件的合并与分离(FILE*)问题:如果你想把一个或多个文件流写入一个文件中,并能实现回放的功能,也就是把之前写入的文本数据按照原来的写入方式分离出来,你要怎么写,又怎么分离?PS:可能好多人已经接触过这类题型,也或者有些参加工作的人遇到过这样类似的面试题,也或者一些才入门的C/C++童鞋们,你们也正在思考这个问题并被困扰着如何下手。 &
下面我就来说明下我的思路,并附上源码(代码没有封装,只供参考),请大大们指出不足之处,不要喷,如果你们有更好的解决办法,也可以拿出来一起探讨探讨!Okay...如果你只把一个文本文件读出并写入另一个文件中,ok,什么都不用考虑,fwrite fread直接用就行但是如果给你两个文本,你难道也那样嘛?如果你不考虑那个回放的功能也就是分离功能的话,你也大可不必考虑什么,只需当第一个文本文件数据写入结束时,将当前的写入指针比如fpwrite指向末尾就行,fseek就能办到--&fseek(fpwrite,0,SEEK_END);然后再写入第二个,这样就避免了两个文本写入时被覆盖的情况,初步达到友好合并的效果,但是问题出现了,你怎么样把这两个文件的内容很完美的从当前的文件中分离出来再分别保存到两个文件中呢?有些人说,这不好办,我每写入一次文件,在文件末尾做个标记MARK,那么我分离的时候只要每次匹配我的MARK就行了啊!?但是,你的MARK肯定是受限制的吧?万一你的MARK标记的内容正好是你写入的文件里面数据的一部分呢?如果这样,坏了,你分离的肯定是乱七八糟,断断续续,这不坑人嘛!Then....也许你们还有其他的想法,现在我来说说我的想法。先就一个文本文件来分析。它包括三个部分,文件名称f_name,文件内容buffer,以及文件存储的字节数f_count对于文件内容,你可以很轻松的用fread读出来,至于,f_name和f_count,你可以定义一个结构体,来存储文件的基本信息,包括文本的名字和文本的字节数;如:typedef struct _tg_struct{ char f_name[30]; int savef_ }SAVEFILE;//总过30+2+4个字节前30个字节存储文件名称,后4个字节存储文本内容长度这样如果你写入一个文件,也就是写入一个 结构体+内容 的格式,如果你再写入一个文件,也是这样,这样的好处,体现在分离文件的时候,比如,你若要分离出第一个文件,只需要fread的时候,取出第一个文件头中的信息,分别匹配名字和按长度读取savef_count次,就可以读到第一个文件的末尾,blablablabla,然后控制下指针位置,fseek(fpread,sizeof(SAVEFILE)+savef_count,SEEK_SET);这样的话,当前指针的位置就来到了第二个文件的文件头这里然后,参考第一个文件的读取方式,再分离第二个无非就是copy一下代码(如果不想,封装起来把!)OK,可能你们还有疑问,怎么样计算文件内容的长度,又怎么样根据savef_count读取到一个文件的结尾 下面附上代码,有点乱。。。。  C/C++ code  #include &stdio.h& #include &string.h& #define NULL 0 typedef struct _tg_struct {
char f_name[30];
int savef_
}SAVEFILE;
ERROR_PARAM,
ERROR_FILE,
}; int SaveFile(const char* fSrc1,const char* fSrc2,const char* fDes );//合并文件夹
int ReadFile(char* fDes,const char* fSrc1,const char* fSrc2const ); //分离文件夹
int main() {
printf(&正在写文件,请稍等.....&);
SaveFile(&c:\\a.txt&,&c:\\b.txt&,&c:\\c.txt&);
printf(&正在读文件,请稍等.....&);
ReadFile(&c:\\c.txt&,&c:\\d.txt&,&c:\\e.txt&);
getchar();
int SaveFile(const char* fSrc1,const char* fSrc2,const char* fDes ) {
FILE* fpWrite,*fpR
char buffer[1024];
int a = 0;
int b = 0;
memset(&savef,0,sizeof(SAVEFILE));
fpWrite=fopen(fDes,&wb+&);//写入目标文件
strcpy(savef.f_name,fSrc1);
fpRead=fopen(fSrc1,&rb&);//读源文件1
if(fpWrite==NULL || fpRead==NULL)
return ERROR_PARAM;
fwrite(&savef,1,sizeof(SAVEFILE),fpWrite);//写文件头 此时savef.savef_count=0
while(!feof(fpRead))
a=fread(buffer,1,1000,fpRead);//将内容读入到buffer中
printf(&a=%d\n&,a);
savef.savef_count+=a;//累计文件内容的字节数
fwrite(buffer,1,a,fpWrite);//读了再写入内容
fseek(fpWrite,0,SEEK_SET);//将指针置为文件开始处
fwrite(&savef,1,sizeof(SAVEFILE),fpWrite);//重写文件头 此时savef.savef_count!= 0
printf(&savef_count=%d\n&,savef.savef_count);
fseek(fpWrite,0,SEEK_END);//将文件指针指向文件最后
b=savef.savef_//这个留着下次写时有用
fclose(fpRead);
memset(&savef,0,sizeof(SAVEFILE));//如果对大文件进行置空的话,是非常耗费CPU的
strcpy(savef.f_name,fSrc2);//
printf(&file2_name=%s\n&,savef.f_name);
fpRead=fopen(fSrc2,&rb&);//打开第二个文件
fwrite(&savef,1,sizeof(SAVEFILE),fpWrite);//写文件头信息
while(!feof(fpRead))
a=fread(buffer,1,1000,fpRead);
printf(&a=%d\n&,a);
savef.savef_count+=a;
fwrite(buffer,1,a,fpWrite);//读了再写入内容
fseek(fpWrite,sizeof(SAVEFILE)+b,SEEK_SET);
fwrite(&savef,1,sizeof(SAVEFILE),fpWrite);
printf(&savef_count=%d&,savef.savef_count);
fclose(fpWrite);
fclose(fpRead);
int ReadFile(const char* fSrc,const char* fDes1,const char* fDes2 ) {
FILE *p_//写
FILE *p_ //读
char buffer[1024];
int a = 0;//字节数
int b = 0;//文件内容所占字节数
int current=0;//保存第一次分离的文件的内容所占的字节数
memset(&savef,0,sizeof(SAVEFILE));//置空结构体
p_fread=fopen(fSrc,&rb&);//读写二进制
p_fwrite=fopen(fDes1,&wb+&);//写附加
if(p_fwrite == NULL || p_fread == NULL)
printf(&File open failed.....&);
return ERROR_PARAM;
//将p_fread中指向的大小为sizeof(SAVEFILE)的内容读入到结构体savef中
a=fread(&savef,1,sizeof(SAVEFILE),p_fread);
//savef包括两个部分,一个30字节的文件头 一个4字节的文件内容字节数
b=savef.savef_
current=b;//记下
printf(&\nThe first file bytes is %d\n&,b);
//如果大于0 存在内容 循环控制读取
while(b &= 1000)
a=fread(buffer,1,1000,p_fread);//读入buffer保存读取数据
b-=a;//如果b&1000 则跳出循环 然后按照一次b个字节读取
fwrite(buffer,1,a,p_fwrite);//第一次分离文件,写指针指向fDes1
if(b & 1000)
if(b & 1000 && b & 0)
a=fread(buffer,1,b,p_fread);//一次读完
fwrite(buffer,1,a,p_fwrite);//一次写完
}//end first
fclose(p_fwrite);//关闭第一次读的文件指针
printf(&分离并写入%s成功\n\n&,savef.f_name);
//第二次读
memset(&savef,0,sizeof(SAVEFILE));//再一次置空,防止数据干扰
p_fwrite=fopen(fDes2,&wb+&);//分离第二个文件
fseek(p_fread,sizeof(SAVEFILE)+current,SEEK_SET);//当前读指针指向第二个文件头处
a=fread(&savef,1,sizeof(SAVEFILE),p_fread);
printf(&\nsave_count=%d\n&,savef.savef_count);
b=savef.savef_//第二个文件内容所占的字节数
//同上面,流程一样 最好封装一下
printf(&\nThe first file bytes is %d\n&,b);
while(b &= 1000)
a=fread(buffer,1,1000,p_fread);
fwrite(buffer,1,a,p_fwrite);
//判断下b的值
if(b & 1000)//直接跳出
if(b & 0 && b & 1000)
a=fread(buffer,1,b,p_fread);
//再一次写入剩下不足1000字节的内容
fwrite(buffer,1,a,p_fwrite);
}//end second
printf(&分离并写入%s成功&,savef.f_name);
fclose(p_fwrite);//关闭
fclose(p_fread);
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&}

我要回帖

更多关于 matlab feof 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信