fread读取结构体注意事项
来源:互联网 发布:ketchup免费mac破解版 编辑:程序博客网 时间:2024/06/05 00:13
作者 : 卿笃军
函数原型
参 数
返回值
C的文本读写和二进制读写:
C的文本方读写与二进制读写的差别仅仅体现在回车换行符的处理上.文本方式写时,每遇到一个'\n'(0AH换行符),它将其换成'\r\n'(0D0AH,回车换行),然后再写入文件;当文本读取时,它每遇到一个'\r\n'将其反变化为'\n',然后送到读缓冲区.二进制读写时,其不存在任何转换,直接将写缓冲区中数据写入文件.
参考文章:JianKun的博客,文本文件与二进制文件区别,http://www.cnblogs.com/zhangjiankun/archive/2011/11/27/2265184.html
那么,如果我们要用fread()来读取文本文件呢?下面我们来试一下:
新建一个.txt文件,命名为"f1.txt",然后在里面输入如下内容:
注意上图中的光标位置,我们在最后一行也添加了一个回车~~~
(同时注意每一行字符个数一样多,有时候你看到一样多,其实不是一样多的,因为字符大小不一样,如:'w','i'不一样大)
在面我们来看一下文件大小: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];}LNode;
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];}LNode;int main(){FILE *fp1 = NULL, *fp2 = NULL;struct _stat buf;int i,j,n = 0;LNode *fbuf = NULL, t;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 < n; ++i)fread(&fbuf[i],sizeof(LNode),1,fp1); //读文件for (i = 1; i < n; ++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] = t;}}for (i = 0; i < n; ++i) //写文件fwrite(&fbuf[i],sizeof(LNode),1,fp2);fclose(fp1);fclose(fp2);return 0;}
如果你 strcut _stat结构体看不懂的话,参见这里:C语言中如何获得文件大小,http://blog.csdn.net/qingdujun/article/details/25157107
如下图,排好序的"f2.txt":
当然,上面的结构体里面定义的全部是char类型的成员,不涉及结构体的字节对齐问题。
如果牵涉到结构体的字节对齐问题,可能操作起来会更加复杂。
所以,如果不是必要,请不要用fread()函数读取文本文件。 fscanf(),fgets(),fgetc()等函数都能很好的读取文本文件。
如果你想了解结构体的字节对齐情况,你可以参见:结构体在内存中所占字节大小计算,http://blog.csdn.net/qingdujun/article/details/24844681
- fread读取结构体注意事项
- 使用fread和fseek/rewind读取结构体数据
- 使用ifstream读取文件,windows fread注意事项
- fread写入结构体
- 使用vs2010用fread读取结构体内存自动对齐
- 文件读写结构体信息...fread, fwrite
- 使用fread 注意事项
- C中文件读取fread和fwrite 返回值等注意事项
- fread读取文件注意
- fread 读取文件问题
- 结构体注意事项
- 结构体的注意事项
- iOS 结构体 定义变量注意事项以及保存到数组与读取
- c语言fread读取重复
- fread读取ASCII编码文件
- fread读取Unicode编码文件
- fread读取模式的选择
- fread读取文件(二进制文件)
- zfs_arc_max设置以后没有生效
- 502问题解决方案
- 统计学习笔记(2)——感知机模型
- java异常
- sqlserver 查看进程及杀锁
- fread读取结构体注意事项
- 可穿戴设备还能怎么玩
- iOS:获取图片Alpha图片
- python 添加中文注释
- 一道ThoughtWorks的面试编程题
- SQL SERVER各种服务解释
- 理解HTTP缓存
- ExtJS表单验证
- 很高兴来到CSDN大家庭