本文将介绍在文本流中,读写整数的两个接口– 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
|
返回输入的整数,如果文件结束或者出错返回-
1.
|
putw
函数原型:
1
|
int putw(
int w,
FILE *fp)
|
函数功能:
返回值:
应用
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
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个字节).笔者需要使用这两个接口去读写文件的大小,负数无用处的,所以决定改装一下这两个函数,顺便探究一下这个函数的实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
unsigned int put_uint(unsigned int i,FILE *fp)
{
unsigned
char *s;
s=(
unsigned
char *)&i;
putc(s[
0],fp);
putc(s[
1],fp);
putc(s[
2],fp);
putc(s[
3],fp);
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
|
返回输入的整数,如果文件结束或者出错返回-
1.
|
putw
函数原型:
1
|
int putw(
int w,
FILE *fp)
|
函数功能:
返回值:
应用
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
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个字节).笔者需要使用这两个接口去读写文件的大小,负数无用处的,所以决定改装一下这两个函数,顺便探究一下这个函数的实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
unsigned int put_uint(unsigned int i,FILE *fp)
{
unsigned
char *s;
s=(
unsigned
char *)&i;
putc(s[
0],fp);
putc(s[
1],fp);
putc(s[
2],fp);
putc(s[
3],fp);
return i;
}
|
改进后取值范围为0~4294967295
.
同理,你也可以将这两个接口改为支持 long long
和unsigned long int
等不同长度的整数类型.
原文地址:http://answerywj.com/2016/12/06/从文件流中读写整数--C语言/?ref=myread