C语⾔⽂件读写函数总结
⼀、字符读写
1、字符写⼊⽂件函数 fputc
fputc函数的原型如下:
int fputc( int c, FILE *fp );
参数说明:
其中,c是要写⼊的字节,它虽被定义为整型,但只使⽤最低位的⼀字节,fp是⽂件指针。
fputc的功能:
将字节c输出⾄fp所指向的⽂件。如果成功,位置指针⾃动后移1字节的位置,并且返回c;否则返回EOF。
2、从⽂件中读取字符 fgetc
fgetc函数的原型如下:
int fgetc( FILE *fp );
参数说明:
其中fp为⽂件指针。
fgetc的功能:
从fp所指向的⽂件中读取⼀个字节,如果成功则返回读取的字节,位置指针⾃动后移1字节的位置;否则返回EOF。
⼆、字符串的读写
1、字符串写⼊⽂件函数 fputs
fputs函数的原型如下:
int fputs( const char *s, FILE *fp );
参数说明:
其中,s是要写⼊的字符串,fp是⽂件指针。
fputs的功能:
将字符串s输出⾄fp所指向的⽂件(不含'\0')。如果成功,位置指针⾃动后移,函数返回⼀个⾮负整数;否则返回EOF。
2、从⽂件中读取字符 fgets
char *fgets( char *s, int n, FILE *fp );
参数说明:
其中,s指向待赋值字符串的⾸地址,n是控制读取个数的参数,fp为⽂件指针。
fgets的功能:
从位置指针开始读取⼀⾏或n-1个字符,并存⼊s,存储时⾃动在字符串结尾加上'\0'。如果函数执⾏成功,位置指针⾃动后移,并返回s的值,否则返回NULL。
三、块数据读写
所谓块读写,就是读写n块以m个字节为单位的⼆进制数据,可以是⼀个字符(⼀个字符为⼀字节,则
块⼤⼩为1*1),可以是⼀个长度为n 字符串(块⼤⼩1*n),可以是长度为n的整型数组(整型以4字节算,块⼤⼩4*n),也可以是结构体等任意数据类型,并没有什么限制。
1、向⽂件中写⼊块数据fwrite
fwrite函数的原型如下:
size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp );
参数说明:
ptr:指向保存读写数据的内存的指针,它可以指向数组、变量、结构体等。
size:表⽰每个数据块的字节数。
count:表⽰要读写的数据块的块数。
fp:表⽰⽂件指针。
理论上,每次读写 size*count 个字节的数据。
fwrite的功能:
从内存中的ptr指向的地址开始,将连续n*size字节的内容写⼊fp⽂件中。该函数的返回值是实际写⼊的数据块个数。
2、从⽂件中读取块数据fread
fread函数的原型如下:
size_t fread ( void *ptr, size_t size, size_t count, FILE *fp );
//size_t 是在 stddef.h 头⽂件中使⽤ typedef 定义的数据类型,表⽰⽆符号整数,也即⾮负数,常⽤来表⽰数量。
参数说明:
见fwrite
fread的功能:
从⽂件fp中,连续读取n*size字节的内容,并存⼊ptr指向的内存空间。该函数的返回值是实际读⼊的数据块个数。
四、格式化读写
格式化读写函数包括fprintf和fscanf两个函数,它们只⽤于⽂本⽂件的读写,不能⽤于⼆进制⽂件的读写。⽂本⽂件与⼆进制⽂件的区别下⾯注意点中有介绍。
1、格式化写⼊⽂件fprintf
int fprintf( FILE *fp, const char* format, 输出参数1, 输出参数2… );
参数说明:
其中,fp是⽂件指针,format为格式控制字符串,输出参数列表为待输出的数据。
fprintf的功能:
根据指定的格式(format参数)发送数据(输出参数)到⽂件fp。
例:
#include <stdio.h>
int main()
{
FILE *fp;
fp = fopen("a.txt","w");
int a = 10;
double f = 11.11;
fprintf(fp, "%d%lf", a, f);
fclose(fp);
return 0;
}
注意:fprintf()按格式输⼊到流,其⽤法和printf()相同,不过不是写到控制台,⽽是写到流罢了。注意的是
返回值为此次操作写⼊到⽂件的字节数。如int c =fprintf(fp, "%s %s %d %f", str1,str2, a, b) ;
假设str1:10字节;str2:10字节;a:2字节;b:8字节;则最终c为33,因为写⼊时不同的数据间⾃动加⼊⼀个空格。
2、从⽂件中格式化读取fscanf
fscanf函数的原型如下:
int fscanf( FILE *fp, const char* format, 地址1,地址2… );
函数说明:
其中,fp是⽂件指针,format为格式控制字符串,地址列表为输⼊数据的存放地址。
fscanf的功能:
根据指定的格式(format参数)从⽂件fp中读取数据⾄内存(地址)。
例:
#include <stdio.h>
int main()
{
FILE *fp;
fp = fopen("a.txt","r"); //需要创建a.txt⽂件,然后写⼊两个数据,空格隔开
int i=0;
double f=0;
fscanf( fp, "%d%lf", &i, &f );
fclose(fp);
printf("%d\n%lf\n",i,f);
return 0;
}
五、⼀些注意点
(上⾯的都是⽹上抄的,下⾯的是我⾃⼰总结的,⼤佬们有砖的话轻点拍)
1、fputc和fgetc注意点
fputc 每次只能存⼀个字节,如果将整型、浮点型等数据类型写⼊⽂件(因为整型浮点型每个数据都需要好⼏个字节,由于平台不同不固定,具体⾃⼰查不列出),就会造成数据只截取最后⼀个字节导致数据出错;同理fgetc每次也只能读取⼀个字节。这时⽤ fprintf 和fscanf 函数格式化读写⽐较合适。
fgetc 每次调⽤只能获取⼀个字节,如果是中⽂字符,utf8 编码会占⽤三个字节,因此要⽤ fgets 来读取。当然你不嫌累也可以⽤ fgetc 读三次,然后拼成⼀个中⽂字符。
2、fputs和fgets注意点
fgets 有局限性,每次最多只能从⽂件中读取⼀⾏内容,因为 fgets 遇到换⾏符就结束读取。如果希望读取多⾏内容,需要使⽤ fread 函数;相应地写⼊函数为 fwrite。
3、fwrite和fread注意点
fwrite和fread直接读写⼆进制⽂本。
Ⅰ、这⾥有⼈可能有疑问,⼆进制⽂件和⽂本⽂件有什么区别?
参考:
直观上的区别是:⽂本⽂件打开后我们可以看懂,⽽⼆进制⽂件打开会是⼀堆“乱码”。但是,其实所有的⽂件在计算机中都是⼆进制,导致“乱码”是因为编码上不同。
举个例⼦,⽐如在代码中的整型数65,⽤fwrite⽅式写⼊⽂件,我们打开⽂件时就会惊奇的发现,⽂件中并不是65,⽽是⼀个⼤写的'A' 。⽽我们⽤fprintf却不会出现这个问题,65还是65。这是为什么呢?
因为fwrite是直接将数据65写进了⽂件,⽽fprintf是将65拆成两个字符,‘6’和‘5’,‘6’和‘5’在ASCII编码表中分别是54和53,于是将54和53写进⽂件。写进⽂件后我们再来看打开⽂件时发⽣了什么?
⽂件软件⾸先将⽂件中的数据读进内存,然后再将内存中的数据根据这个⽂本软件设置的编码格式(⽐如utf-8)进⾏解码。来看fwrite写⼊的⽂件,⽂件软件读到 '65' 后去编码表中到对应数据,是 'A' 然后就将 'A' 输出到屏幕上;再看⽤fprintf写⼊的⽂件,⽂件软件读到 '54' 和 '53' 后去编码表中到对应数据,是 '6' 和 '5' ,因此最终我们在屏幕上看到的是65。
更详细的解释去看我发的参考链接,可能讲的更清楚。
注:上⾯直观上的区别说法不是很准确。当读写采⽤不同编码表时就会产⽣乱码,⽐如你是以utf-8格式写⼊⽂件,然后将⽂件软件换个编码格式,⽐如 "GB2312" ,这时再打开也会是乱码,根本原因是
相同的字符在不同编码中的编号是不同的,⽐如 "你" 字,"utf-8" 中的编码为e4 bd a0,⽽在 "GB2312" 中的编码为 c4 e3,你⽤e4 bd a0在 "GB2312" 为编码下打开,就会在 "GB2312" 中去对应的字符,那么当然不会是 "你" 字了,也就会产⽣乱码。
Ⅱ、fopen函数中以⽂本⽅式与⼆进制⽅式打开⽂件的区别
a、Windows平台下fprintf格式
如果以“⽂本”⽅式打开⽂件,当读取⽂件的时候,系统会将所有的"/r/n"转换成"/n";当写⼊⽂件的时候,系统会将"/n"转换成"/r/n"写⼊。
如果以"⼆进制"⽅式打开⽂件,则读/写都不会进⾏这样的转换。
b、在Unix/Linux平台下
“⽂本”与“⼆进制”模式没有区别。
读写⼆进制⽂件,在fopen函数中mode的参数要加上“b”,⽤来告诉函数库打开的⽂件为⼆进制⽂件,⽽⾮纯⽂字⽂件。不过在POSIX 系统,包含Linux下会忽略该字符。
Ⅲ、了解了⽂本⽅式与⼆进制⽅式区别我们来总结⼀下分别是哪些函数使⽤
a、⽂本⽅式读写:fprintf/fscanf
b、⼆进制⽅式读写:fgetc/fput
c、fgets/fputs、fread/fwrite
另:fwrite/fread与write/read的区别:
4、fprintf和fscanf注意点
fscanf将读取的ascii码转换成⼆进制放到内存中,效率略低;fgetc fputc 都是按照字节存取,⽆论⽂本模式还是⼆进制模式打开,都按照⼀个⼀个字节读取,不存在\r\n问题。
还有⼀点是很多⽹站中⽂转utf-8的编码转换,utf-8编码是错的,它上⾯其实显⽰出来的是unicode编码,把我搞混好长时间。
六、代码实例
附上我的测试实例,有空的话⾃⼰打开⼀个个开关,编译运⾏看是否符合⾃⼰预期
#include <stdio.h>
#include <string.h>
typedef struct
{
char str1[6];
char str2[6];
char str3[6];
}STRS;
int main()
{
FILE *fp;
/*
* fputc
*/
#if 0
fp = fopen("a.txt","w");
//char a[3] = "你";
//fputc(a[0],fp);
//fputc(a[1],fp);
//fputc(a[2],fp);
int a=33;
fputc(a,fp);
fclose(fp);
#endif
/*
* fgetc
*/
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论