了解函数-fread函数和fwrite函数
来源:互联网 发布:清华同方录音笔软件 编辑:程序博客网 时间:2024/05/01 05:28
【了解函数-fread函数和fwrite函数】1.函数功能
用来读写一个数据块。
2.一般调用形式
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
3.说明
(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。
(2)size:要读写的字节数;
(3)count:要进行读写多少个size字节的数据项;
(4)fp:文件型指针。
注意:1 完成次写操(fwrite())作后必须关闭流(fclose());
2 完成一次读操作(fread())后,如果没有关闭流(fclose()),则指针(FILE * fp)自动向后移动前一次读写的长度,不关闭流继续下一次读操作则接着上次的输出继续输出;
3 fprintf() : 按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了。注意的是返回值为此次操作写入到文件的字节数。如int c = fprintf(fp, "%s %s %d %f", str1,str2, a, b) ;str1:10字节;str2: 10字节;a:2字节;b:8字节,c为33,因为写入时不同的数据间自动加入一个空格。
文件使用之后一定要关闭,否则将不能正确显示内容.fwrite:读入两个学生信息然后用fwrite存入文件
fread:用fread从文件中读出学生信息。
001
fwrite.c
002
003
#include
004
005
#define SIZE 2
006
007
struct
student_type
008
009
{
010
011
char
name[10];
012
013
int
num;
014
015
int
age;
016
017
char
addr[10];
018
019
}stud[SIZE];
020
021
void
save()
022
023
{
024
025
FILE *fp;
026
027
int
i;
028
029
if
((fp=fopen(
"stu_list"
,
"wb"
))==NULL)
030
031
{
032
033
printf(
"cant open the file"
);
034
035
exit(0);
036
037
}
038
039
for
(i=0;i
040
041
{
042
043
if
(fwrite(&stud[i],
sizeof
(
struct
student_type),1,fp)!=1)
044
045
printf(
"file write error\n"
);
046
047
}
048
049
fclose(fp);
050
051
}
052
053
main()
054
055
{
056
057
int
i;
058
059
for
(i=0;i
060
061
{
062
063
scanf(
"%s%d%d%s"
,&stud[i].name,&stud[i].num,&stud[i].age,&stud[i].addr);
064
065
save();
066
067
}
068
069
for
(i=0;i
070
071
{
072
073
printf(
"%s,%d,%d"
,stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
074
075
}
076
077
}
078
079
fread.c
080
081
#include
082
083
#define SIZE 2
084
085
struct
student_type
086
087
{
088
089
char
name[10];
090
091
int
num;
092
093
int
age;
094
095
char
addr[10];
096
097
}stud[SIZE];
098
099
void
read()
100
101
{
102
103
FILE *fp;
104
105
int
i;
106
107
if
((fp=fopen(
"stu_list"
,
"rb"
))==NULL)
108
109
{
110
111
printf(
"cant open the file"
);
112
113
exit(0);
114
115
}
116
117
for
(i=0;i
118
119
{
120
121
if
(fread(&stud[i],
sizeof
(
struct
student_type),1,fp)!=1)
122
123
printf(
"file write error\n"
);
124
125
}
126
127
fclose(fp);
128
129
}
130
131
main()
132
133
{
134
135
int
i;
136
137
read();
138
139
for
(i=0;i
140
141
{
142
143
printf(
"%s,%d,%d,%s"
,stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
144
145
printf(
"\n"
);
146
147
}
148
149
}
在C语言中进行文件操作时,我们经常用到fread()和fwrite(),用它们来对文件进行读写操作。下面详细绍一下这两个函数的用法。
我们在用C语言编写程序时,一般使用标准文件系统,即缓冲文件系统。系统在内存中为每个正在读写的文件开辟“文件缓冲区”,在对文件进行读写时数据都经过缓冲区。要对文件进行读写,系统首先开辟一块内存区来保存文件信息,保存这些信息用的是一个结构体,将这个结构体typedef为FILE类型。我们首先要定义一个指向这个结构体的指针,当程序打开一个文件时,我们获得指向FILE结构的指针,通过这个指针,我们就可以对文件进行操作。例如:
01
#i nclude
02
03
#i nclude
04
05
int
main()
06
07
{
08
09
FILE *fp;
10
11
char
buffer[
100
] =
"This is a test"
;
12
13
if
((fp = fopen(
"c:\\example.txt"
,
"w"
)) ==
0
)
14
15
{
16
17
printf(
"open failed!"
);
18
19
exit(
1
);
20
21
}
22
23
fwrite(buffer,
1
, strlen(
"This is a test"
), fp);
24
25
fclose(fp);
26
27
return
0
;
28
29
}
30
31
通过以上代码,我们就在c盘的根目录下建立了一个名为example扩展名为.txt的文件,我们打开可以看到上面写上了This is a test。当我们对它将它读出时,用如下代码:
32
33
#i nclude
34
35
#i nclude
36
37
int
main()
38
39
{
40
41
FILE *fp;
int
len;
42
43
char
buffer[
100
];
44
45
/*memset(buffer, 1, 100); */
46
47
if
((fp = fopen(
"c:\\example.txt"
,
"r"
)) ==
0
)
48
49
{
50
51
printf(
"open failed!"
);
52
53
exit(
1
);
54
55
}
56
57
fseek(fp, 0L, SEEK_END);
58
59
len = ftell(fp);
60
61
rewind(fp);
62
63
fread(buffer,
1
, len , fp);
64
65
printf(
"%s"
,buffer);
66
67
fclose(fp);
68
69
getch();
70
71
return
0
;
72
73
}
可以看到,当我们使用memset了以后,读出了一大堆乱码,这是为什么呢?原因是我们在fwrite函数时写入的字节数是用strlen求得的,也就是说字符串最后的'\0'并没有写到文件中去。所以我们从文件中读到buffer中时也自然没有'\0',因为buffer中的数是随机的,除非buffer中最后一个字符的下一个数恰好随机到0(可能性很小,这里用memset将它排除),否则以%s将buffer中的字符输出时遇不到0,所以乱码产生。解决的办法有很多,你可以在向文件写数据时多写入一个字节,系统会自动写入0,fwrite(buffer, 1, strlen("This is a test")+1, fp);这样读出时最后就有一个0了。或者读出操作完成后,在最后一个字符后面补上一个0:buffer[len] = 0;这样问题也可得到解决。
- 了解函数-fread函数和fwrite函数
- 了解函数-fread函数和fwrite函数
- fwrite 和 fread函数
- fread和fwrite函数
- fread函数和fwrite函数
- fread函数和fwrite函数
- fread函数和fwrite函数
- fread函数和fwrite函数
- fread函数和fwrite函数
- fread函数和fwrite函数
- fread函数和fwrite函数
- fread函数和fwrite函数
- fread函数和fwrite函数
- fread函数和fwrite函数
- fread函数和fwrite函数
- fread函数和fwrite函数
- fread函数和fwrite函数
- fread函数和fwrite函数
- 练习 树上的三角形
- 我要灌水
- 英语4_8
- Cracking the coding interview--Q19.2
- SQL 去掉两个表中重复的数据
- 了解函数-fread函数和fwrite函数
- 测试
- VBA读取Excel工作表数据方法探索_工作薄
- python的try语句
- 梦想,因坚持而绽放——答大学生的兴趣与行动
- 一个“高大上”的CSS3登入表单
- 深入浅出Java 重定向和请求转发的区别
- uploadify插件可选参数的详细介绍
- div层调整zindex属性无效原因分析及解决方法