c/c++--C之从文件流中读写整数
来源:互联网 发布:c 实现网络爬虫 编辑:程序博客网 时间:2024/06/07 06:52
本文将介绍在文本流中,读写整数的两个接口– int getw(FILE *fp)
和int putw(int w, FILE *fp)
,并且与你分享改进后的更实用的接口– unsigned int get_uint(FILE *fp)
和unsigned int put_uint(unsigned int i,FILE *fp)
.
从文件流中读写整数
我们都知道,数据在计算机内存中都是以二进制的形式存储的,大多数PC的存储方式为小端存储,关于大小端字节序的讨论请参考阮一峰的理解字节序. 如果想直接读写整数,并不是很方便,这里就为你介绍两个接口,需要注意的是这两个接口非ANSI标准函数.
getw
函数原型:
1
int getw(FILE *fp)
函数功能:
1
从fp所指向文件读取下一个整数.
返回值:
1
返回输入的整数,如果文件结束或者出错返回-1.
putw
函数原型:
1
int putw(int w, FILE *fp)
函数功能:
1
将整型w写进fp指向的文件.
返回值:
1
返回输出的整数,如果出错,则返回EOF.
应用
代码:
1234567891011121314151617181920212223242526272829303132333435
#include <stdio.h>#include <stdlib.h>int main(int argc,char *argv[]){FILE *fp = NULL;int num[2] = {-2147483648,2147483647};fp = fopen("./log", "wb");if (fp == NULL){fprintf(stderr,"open file failed");exit(EXIT_FAILURE);}putw(num[0],fp);putw(num[1],fp);fclose(fp);fp = NULL;fp = fopen("./log", "rb");if (fp == NULL){fprintf(stderr,"open file failed");exit(EXIT_FAILURE);}printf("%d %d\n",getw(fp),getw(fp));fclose(fp);fp = NULL;return 0;}
结果为:
1
$ 2147483647 -2147483648
注意: 函数参数的压栈顺序是从左到右的,所以最后一个参数
getw(fp)
在栈顶,第一个出栈执行.
实现与改进(完整代码)
由于上述两个接口支持的是int型,所以取值范围为-2147483648~2147483647
.(此文认为int型都为4个字节).笔者需要使用这两个接口去读写文件的大小,负数无用处的,所以决定改装一下这两个函数,顺便探究一下这个函数的实现:
123456789101112131415
unsigned int get_uint(FILE *fp){unsigned char *s;unsigned int i;s = (unsigned char *)&i;s[0]=getc(fp);printf("%x\n",s[0]);s[1]=getc(fp);printf("%x\n",s[1]);s[2]=getc(fp);printf("%x\n",s[2]);s[3]=getc(fp);printf("%x\n",s[3]);return i;}
1234567891011121314
unsigned int put_uint(unsigned int i,FILE *fp){unsigned char *s;s=(unsigned char *)&i;putc(s[0],fp);//printf("%x\n",s[0]);putc(s[1],fp);//printf("%x\n",s[1]);putc(s[2],fp);//printf("%x\n",s[2]);putc(s[3],fp);//printf("%x\n",s[3]);return i;}
改进后取值范围为
0~4294967295
.
同理,你也可以将这两个接口改为支持 long long
和unsigned long int
等不同长度的整数类型.
本文将介绍在文本流中,读写整数的两个接口– int getw(FILE *fp)
和int putw(int w, FILE *fp)
,并且与你分享改进后的更实用的接口– unsigned int get_uint(FILE *fp)
和unsigned int put_uint(unsigned int i,FILE *fp)
.
从文件流中读写整数–C语言
我们都知道,数据在计算机内存中都是以二进制的形式存储的,大多数PC的存储方式为小端存储,关于大小端字节序的讨论请参考阮一峰的理解字节序. 如果想直接读写整数,并不是很方便,这里就为你介绍两个接口,需要注意的是这两个接口非ANSI标准函数.
getw
函数原型:
1
int getw(FILE *fp)
函数功能:
1
从fp所指向文件读取下一个整数.
返回值:
1
返回输入的整数,如果文件结束或者出错返回-1.
putw
函数原型:
1
int putw(int w, FILE *fp)
函数功能:
1
将整型w写进fp指向的文件.
返回值:
1
返回输出的整数,如果出错,则返回EOF.
应用
代码:
1234567891011121314151617181920212223242526272829303132333435
#include <stdio.h>#include <stdlib.h>int main(int argc,char *argv[]){FILE *fp = NULL;int num[2] = {-2147483648,2147483647};fp = fopen("./log", "wb");if (fp == NULL){fprintf(stderr,"open file failed");exit(EXIT_FAILURE);}putw(num[0],fp);putw(num[1],fp);fclose(fp);fp = NULL;fp = fopen("./log", "rb");if (fp == NULL){fprintf(stderr,"open file failed");exit(EXIT_FAILURE);}printf("%d %d\n",getw(fp),getw(fp));fclose(fp);fp = NULL;return 0;}
结果为:
1
$ 2147483647 -2147483648
注意: 函数参数的压栈顺序是从左到右的,所以最后一个参数
getw(fp)
在栈顶,第一个出栈执行.
实现与改进(完整代码)
由于上述两个接口支持的是int型,所以取值范围为-2147483648~2147483647
.(此文认为int型都为4个字节).笔者需要使用这两个接口去读写文件的大小,负数无用处的,所以决定改装一下这两个函数,顺便探究一下这个函数的实现:
123456789101112131415
unsigned int get_uint(FILE *fp){unsigned char *s;unsigned int i;s = (unsigned char *)&i;s[0]=getc(fp);printf("%x\n",s[0]);s[1]=getc(fp);printf("%x\n",s[1]);s[2]=getc(fp);printf("%x\n",s[2]);s[3]=getc(fp);printf("%x\n",s[3]);return i;}
1234567891011121314
unsigned int put_uint(unsigned int i,FILE *fp){unsigned char *s;s=(unsigned char *)&i;putc(s[0],fp);//printf("%x\n",s[0]);putc(s[1],fp);//printf("%x\n",s[1]);putc(s[2],fp);//printf("%x\n",s[2]);putc(s[3],fp);//printf("%x\n",s[3]);return i;}
改进后取值范围为
0~4294967295
.
同理,你也可以将这两个接口改为支持 long long
和unsigned long int
等不同长度的整数类型.
原文地址:http://answerywj.com/2016/12/06/从文件流中读写整数--C语言/?ref=myread
- c/c++--C之从文件流中读写整数
- 从文件流中读写整数--C语言
- C--文件读写
- C++:文件流读写
- 【C/C++】文件读写
- C语言从TXT文件中读写数据
- C语言从TXT文件中读写数据
- C语言之文件读写
- C/C++之读写文件
- C#中读写INI文件
- C#中读写INI文件
- C/C++中读写文件
- Objective-C 【从文件中读写字符串(直接读写/通过NSURL读写)】
- C文件之三 文件的读写
- object-c 文件基本读写
- Object-C文件的读写
- C++/C 文件二进制读写
- C++/C 文件二进制读写
- Linux hosts文件详解+mac主机名
- 在Python里安装Jieba中文分词组件
- spring事务的传播机制及隔离级别
- HBase数据模型特性及表设计思路
- 百度地图导航(不需要百度地图的jar包和so文件)
- c/c++--C之从文件流中读写整数
- 拼图框架中的全选
- 自定义可滑动的tab选项卡,可切换选项卡样式(下划线,仿小米三角形,方形背景)
- [jQuery知识]jQuery之知识三-过滤器
- 第12期 【听见梦想的声音】 12月刊
- Leetcode263. Ugly Number
- linux man 手册各个章节的意义和用法 .
- mysql的write skew问题
- 对PAR DAR SAR的理解