一、字符读写

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

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 定义的数据类型,表示无符号整数,也即非负数,常用来表示数量。参数说明:见fwritefread的功能:从文件fp中,连续读取n*size字节的内容,并存入ptr指向的内存空间。该函数的返回值是实际读入的数据块个数。

四、格式化读写

格式化读写函数包括fprintf和fscanf两个函数,它们只用于文本文件的读写,不能用于二进制文件的读写。文本文件与二进制文件的区别下面注意点中有介绍。

1、格式化写入文件fprintf

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直接读写二进制文本。

Ⅰ、这里有人可能有疑问,二进制文件和文本文件有什么区别?

参考:

1、https://www.zhihu.com/question/19971994

2、https://www.cnblogs.com/zhangjiankun/archive/2011/11/27/2265184.html

直观上的区别是:文本文件打开后我们可以看懂,而二进制文件打开会是一堆“乱码”。但是,其实所有的文件在计算机中都是二进制,导致“乱码”是因为编码上不同。

举个例子,比如在代码中的整型数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函数中以文本方式与二进制方式打开文件的区别

参考:https://blog.csdn.net/recsysml/article/details/44195793

a、Windows平台下 
如果以“文本”方式打开文件,当读取文件的时候,系统会将所有的"/r/n"转换成"/n";当写入文件的时候,系统会将"/n"转换成"/r/n"写入。 
如果以"二进制"方式打开文件,则读/写都不会进行这样的转换。

b、在Unix/Linux平台下

“文本”与“二进制”模式没有区别。

读写二进制文件,在fopen函数中mode的参数要加上“b”,用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux下会忽略该字符。

Ⅲ、了解了文本方式与二进制方式区别我们来总结一下分别是哪些函数使用

a、文本方式读写:fprintf/fscanf

b、二进制方式读写:fgetc/fputc、fgets/fputs、fread/fwrite

另:fwrite/fread与write/read的区别:

https://blog.csdn.net/ljlstart/article/details/49535005

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 0fp = 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*/#if 0 fp = fopen("a.txt","r");char c1 = fgetc(fp);char c2 = fgetc(fp);fclose(fp);printf("%c\n%c\n",c1,c2);
#endif/** fputs*/#if 0fp = fopen("b.txt","w");char *s = "你好";fputs(s, fp);fclose(fp);
#endif/** fgets*/#if 0fp = fopen("b.txt","r");STRS Strs;STRS *strs = &Strs;char hello1[6] = "hello";char hello3[6] = {'n','i','h','a','o'};memset(strs->str1,0,6);memcpy(strs->str1,hello1,6);memset(strs->str3,0,6);memcpy(strs->str3,hello3,6);//注意1:fgetc只能获取一位char字符,如果是中文字符,需要占三位char字符,因此要用fgets来读取;//注意2:读取的数据的长度要小于等于字符数组长度-1,因为字符串最后要存放'\0'。例如现在str2的长度为6,就会导致strs->str2最后不能加上‘\0’,从而会越界,连带输出str3,最终输出你好hellomemset(strs->str2,0,6);fgets(strs->str2,7,fp);memset(strs->str3,0,6);memcpy(strs->str3,hello3,6);printf("%s\n",strs->str2);fclose(fp);
#endif/** fprintf*/#if 0fp = fopen("c.txt","w");int b = 65;//double f = 1.11;//char s[3] = "你";//fprintf(fp, "%s", s);fprintf(fp, "%d", b);//fprintf(fp, "%d %lf", a, f);fclose(fp);
#endif/** fscanf*/#if 0fp = fopen("c.txt","r+"); //需要创建a.txt文件,然后写入两个数据,空格隔开//int i=0;//double f=0;//fscanf( fp, "%d%lf", &i, &f );//printf("%d\n%lf\n",i,f);char c;fscanf( fp, "%c", &c);printf("%c\n",c);fclose(fp);fp = fopen("c.txt","r+");int fscanf_int;fscanf( fp, "%d", &fscanf_int );printf("%d",fscanf_int);fclose(fp);
#endif
#if 0fp = fopen("e.txt","r");double a = 0;fscanf( fp, "%lf", &a);fclose(fp);printf("%lf\n",a);
#endif/** fwrite*/#if 0fp = fopen("e.txt","wb");//char array[3] = "你";//fwrite(array, sizeof(char), 3, fp);//double array[3] = {1.11, 2.22, 3.33};//fwrite(array, sizeof(double), 3, fp);//double a = 3.14159;//fwrite(&a, sizeof(double), 1, fp);char a=65;fwrite(&a, sizeof(char), 1, fp);fclose(fp);
#endif/** fread*//*fp = fopen("e.txt","rb");double array[3];fread(array, sizeof(double), 3,fp);fclose(fp);for(int i=0;i<3;i++){printf("%lf\n",array[i]);}*/return 0;
}

C语言文件读写函数总结相关推荐

  1. c语言文件写入函数有哪些,c语言文件读写函数有哪些?

    c语言文件读写函数有:"fgetc"和"fputc"(字符读写函数)."fgets"和"fputs"(字符串读写函数). ...

  2. c语言创建一个文件函数,c语言文件读写函数 用C语言的函数创建、打开和读写文件...

    C语言文件读写结构体里面的数据怎样存到磁盘文件上 c语言对同一个文件进行读写(r+) 编写程序,将文本文件c.txt中的所有小写字母转换成相应的大写字母,其他一.标准文件的读写 1.文件的打开 fop ...

  3. Linux下c语言文件读写函数总结

    1.FILE *fopen(const char *filename, const char *mode) "r" 打开一个用于读取的文件.该文件必须存在. "w&quo ...

  4. C语言文件读写常用函数总结

    C语言文件读写常用函数总结 有点小头疼这几天复习,可是总是有些小可爱问有关C语言文件方面的内容,在此写篇博文一劳永逸. 目录 C语言文件读写常用函数总结 fopen函数 fclose函数 fseek函 ...

  5. C语言 文件读写 fputs 函数 - C语言零基础入门教程

    目录 一.fgets 函数简介 二.fgets 函数使用 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.fgets 函数简介 fge ...

  6. C语言 文件读写 fputc 函数 - C语言零基础入门教程

    目录 一.fputc 函数简介 二.fputc 函数使用 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.fputc 函数简介 fpu ...

  7. C语言 文件读写 fseek 函数 - C语言零基础入门教程

    目录 一.fseek 函数简介 二.fseek 函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.fseek 函数简介 fse ...

  8. C语言 文件读写 ferror 函数 - C语言零基础入门教程

    目录 一.ferror 函数简介 二.ferror 函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.ferror 函数简介 ...

  9. 教你如何运用python实现简单文件读写函数

    这篇文章主要为大家详细介绍了python实现简单文件读写函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 python作为脚本性语言,加上它的简便易用性.会经常当作脚 ...

最新文章

  1. Android Studio 运行、编译卡死的解决办法
  2. 何恺明等人新作:效果超ResNet,利用NAS方法设计随机连接网络 | 技术头条
  3. Spock是什么?它和JUnit,JMock有什么区别?
  4. 【译】JavaScript中的Callbacks
  5. abstract interface 和 interface 没有区别
  6. 牛客网 牛客练习赛13 C.幸运数字Ⅲ-思维
  7. C++ 函数部分(1)
  8. 备份全网服务器数据生产架构方案案例模型
  9. node.js中对Event Loop事件循环的理解
  10. linux下面拷贝gbk编码的网页
  11. 【遥感数字图像处理】基础知识:第二章 遥感知识回顾、遥感数字图像处理基础知识
  12. Leetcode--210.课程表Ⅱ
  13. matlab m序列,m序列(M序列与m序列区别)
  14. java计算距离_java实现计算地理坐标之间的距离
  15. Redis——史上最强【集群】入门实践教程
  16. jsp页面格式化时间或数字
  17. 95.91p30.space\/index.php,关于 ThinkPHP6 分页样式的定制及点击下一页搜索条件丢失的解决方法...
  18. Spark之hive的UDF自定义函数
  19. linux运行jar包依赖,linux怎么打jar包
  20. 元气骑士机器人旁边建筑_元气骑士机器人的一些经验

热门文章

  1. 转载 天涯[经济杂谈]一位创业者的商海感悟(语录版,连载中,持续更新)【力荐】
  2. Ubuntu系统中gcc安装
  3. SOAMANAGER 打不开浏览器
  4. Linux 仅安装mysql客户端
  5. 使用Python 开发录屏小工具
  6. 【重磅】微信开源PhxSQL:高可用、强一致的MySQL集群
  7. 比较Kotlin性能与Graal和C2
  8. 解决jenkins构建失败,空间不足问题
  9. Requirement already satisfied+红字Read time out(upgrading via the ‘python -m pip install --upgrad)解决办法
  10. LeetCode:96. Unique Binary Search Trees(找出独一无二搜索树)