文件操作大致分三步

  1. 打开文件
  2. 读写文件
  3. 关闭文件

二进制和文本模式的区别

  • 在windows系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n" 。
  • 在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别
  • 对于GBK编码的汉字,一个汉字两个字节,对于utf8来讲一个汉字3个字节,但如果英文字母都是一个字节

fopen

FILE *p = fopen("a.txt", "r");

第一个参数指定打开的文件名,第二个参数指定打开方式

返回值如果是NULL,代表打开失败,打开成功返回文件流

关于第二个参数的说明如下:

r:以只读方式打开文件,该文件必须存在。

r+:以可读写方式打开文件,该文件必须存在。用r+写文件时候,从文件开始位置写入

rb+:读写打开一个二进制文件,允许读写数据,文件必须存在。

rw+:读写打开一个文本文件,允许读和写。

w:打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

wb

按照二进制格式写文件,在windows下不会自动添加'\r'wb:只对windows有效,对于linux而言,w与wb效果相同。

w+:打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

a:以附加的方式打开只写文件。若文件不存在,则会建立该文件,行为和w是一样,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)

a+:以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)

b:只对windows有效,对于unix来讲是无效

fclose

fclose关闭fopen打开的文件

fclose(p);

getc和putc

getc从文件中读取一个字符

int main()
{
FILE *fp = fopen("a.txt", "r");
char c;
while ((c = getc(fp)) != EOF)
{
printf("%c", c);
}
fclose(fp);
return 0;
}

putc向文件中写入一个字符

int main()
{
FILE *fp = fopen("a.txt", "w");
const char *s = "hello world";
int i;
for (i = 0; i < strlen(s); i++)
{
putc(s[i], fp);
}
fclose(fp);
return 0;
}

EOF与feof函数文件结尾

对于一个文件来说,文件的结尾是EOF

char c = 0;
while((c = getc(p)) != EOF)
{
printf("c = %c\n", c);
}

feof用作判断文件是否读完,如果已经到文件结尾,返回true

FILE *p1 = fopen("a.txt", "r");
FILE *p2 = fopen("b.txt", "w");
char buf[1024] = { 0 };
while(!feof(p1))
{
fgets(buf, sizeof(buf), p1);//读取一行文件
fputs(buf, p2);
}
fclose(p1);
fclose(p2);

fprintf,fscanf,fgets,fputs

这些函数都是通过FILE *来对文件进行读写

printffprintfsprintf有何关系?

三者都是格式化输出函数,不同的是输出的对象不一样

printf向标准输出设备输出

printf("%s", "test");

sprintf向字符串输出

char buf[1024] = { 0 };
sprintf(buf, "%s", "test");

fprintf向文件输出,严格输入,不会添加'\n'

FILE *p = fopen("a.txt", "w");
fprintf(p, "%s", "test");

fscanf从文件读取,如果在一行中遇到空格便结束读取本行读取

FILE *p = fopen("a.txt", "r");
char buf[1024] = { 0 };
fscanf(p, "%s", buf);//读取到的存入buf

fgets函数每次读取一行,有三个参数,第一个参数代表临时存储位置,第二个参数代表大小,第三个代表读取位置

fgets(buf, sizeof(buf), p);

fputs函数每次写入一行,有两个参数,第一个参数是临时存储位置,第二个是写入位置

fputs(buf, p);

fscanf不会读取行尾的'\n'fgets会将行尾的'\n'读取到buf里面

不论fprintf还是fputs都不会自动向行尾添加\n,需要代码中往buf的行尾写\n才可以达到换行的目录

stat

头文件包含:#include <sys/stat.h>

函数的第一个参数代表文件名,第二个参数是struct stat结构地址

struct stst st;
memset(&st, 0, sizeof(st));
stst("a.txt", &st);

得到文件的属性,包括文件建立时间,文件大小等信息

fseek

函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败则不改变stream指向的位置,函数返回一个非0值

超出文件末尾位置,还是返回0。往回偏移超出首位置,还是返回0

第一个参数stream为文件指针

第二个参数offset为偏移量,单位:字节,正数表示正向偏移,负数表示负向偏移

第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR(当前位置)、SEEK_END(文件结尾)或 SEEK_SET(文件开头)

fseek(fp, 3, SEEK_SET);

ftell

函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置

long len = ftell(fp)

fgetpos和fsetpos

fgetpos和fsetpos是ftell和fseek的加强版

fseek与ftell返回的是long类型,如果文件很大,超过long的范围,那么该函数会有问题,fgetpos与fsetpos函数可以处理更大的文件类型

返回值:成功返回0,否则返回非0

fpos_t ps = 0;
fgetpos(fp, &ps);
fpos_t ps = 2;
fsetpos(fp, &ps);

fflush

只有调用了fclose之后,所有的写入操作才真实的把内容写入文件

所有的C库函数文件读写操作都是针对缓冲区进行的,并不是真实的文件

缓冲区写满以后,写入缓冲区

fflush函数可以将缓冲区中任何未写入的数据写入文件中。

fflush(p);//实时写入到文件中去

修改配置文件,希望修改实时生效,那么每次修改完成之后我们fflush一次

fread和fwrite

fread和fwrite以二进制形式对文件进行操作,不局限于文本文件

size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);

返回值:返回实际写入或读取的数据块数目

只要读取到文件最后,没有完整的读取一个数据块出来,fread就返回0

第一个参数代表void *,写入或者读取的缓冲区

第二个参数是代表写入或读取的时候一个单位的大小

第三个参数是代表写入或读取几个单位

第四个参数是FILE *

char buf[1024] = { "test" };
fwrite(buf, strlen(buf), 1, p);

fread与feof的注意点

fopen读到文件末尾,并不立即返回真,再调用一次才会返回真

while (!feof(p))
{
fread(&buf, 1, sizeof(buf), p);
}
while (fread(&buf, 1, sizeof(buf), p))
{}

C学习笔记-文件操作的更多相关文章

  1. python学习笔记:文件操作和集合(转)

    转自:http://www.nnzhp.cn/article/16/ 这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句 ...

  2. erlang学习笔记(文件操作)

    参考这里和这里了解到的文件操作的模块有很多:kernel下有:file,stdlib下有:filelib,filename,file_sorter.(具体查看官方文档)

  3. python基础学习笔记——文件操作

    文件操作 初始文件操作 使用Python来读写文件是非常简单的操作,我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了 根据打开方式的不同能够执行的操作 ...

  4. 03 python学习笔记-文件操作(三)

    本文内容主要包括以下方面: 1. 文件操作基本认识2. 只读(r, rb)3. 只写(w, wb)4. 追加(a, ab)5. r+读写6. w+写读7. a+写读(追加写读)8. 文件的修改 一.文 ...

  5. Python学习笔记——文件操作

    python中,一切皆对象.   一.文件操作流程 (1)打开文件,得到一个文件句柄(对象),赋给一个对象: (2)通过文件句柄对文件进行操作: (3)关闭文件. 文件对象f通过open()函数来创建 ...

  6. Python3.5学习笔记-文件操作

    在Python中,操作文件对象使用open函数来创建,下表列出了常用的操作file的函数: 序号 方法及描述 1.file.close() 关闭文件.关闭后文件不能再进行读写操作. 2.file.fl ...

  7. c语言学习笔记 - 文件操作

    #include <stdio.h>#include <time.h> int main(void){ time_t t;               //类似于size_t那 ...

  8. MongoDB学习笔记:Python 操作MongoDB

    MongoDB学习笔记:Python 操作MongoDB   Pymongo 安装 安装pymongopip install pymongoPyMongo是驱动程序,使python程序能够使用Mong ...

  9. 《python基础教程(第二版)》学习笔记 文件和素材(第11章)

    <python基础教程(第二版)>学习笔记 文件和素材(第11章) 打开文件:open(filename[,mode[,buffering]]) mode是读写文件的模式f=open(r' ...

随机推荐

  1. hdu 6070 Dirt Ratio

    题 OvO http://acm.hdu.edu.cn/showproblem.php?pid=6070 (2017 Multi-University Training Contest - Team ...

  2. Ubuntu 保存文件时报E212

    命令输入: vim test/conf.conf 出现如下报错:  步骤一: 没有足够的权限!使用如下代码尝试: :w !sudo tee % > /dev/null 如果步骤一没有解决问题,尝 ...

  3. Confluence 6 分享一个文件

    协同合作和编辑不仅仅是发生在页面中,很多时候你需要与你的项目小组针对文档,报告,图片,表格进行协同操作.不管是针对性的市场计划或者一个完整的项目计划,你可以在 Confluence 中让你的项目小组成 ...

  4. #7 div2 B Layer Cake 造蛋糕 智商题+1

    B - Layer Cake Time Limit:6000MS     Memory Limit:524288KB     64bit IO Format:%I64d & %I64u Sub ...

  5. flask框架(七): flask模板

    1.模板的使用 Flask使用的是Jinja2模板,所以其语法和Django无差别 2.自定义模板方法 Flask中自定义模板方法的方式和Bottle相似,创建一个函数并通过参数的形式传入render ...

  6. Node.js 安装与开发

    Node.js 简介 Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装.Node.js对一些 ...

  7. 两列布局实现各自独立滚屏,类似与 scrollNav 的功能。

    现在移动端 web 开发越来越靠近 app 的功能.所以两列布局各自都能实现独立滚动也常见.基于固定侧边栏导航,另一侧实现内容展示. 这个功能的核心在于使用 vh 单位. 其中 CSS 的代码是核心点 ...

  8. luoguP5024 保卫王国

    题目链接 问题分析 其实是比较明显的动态DP. 懒于再推一遍式子,直接用 最小权点覆盖=全集-最大权独立集,然后就和这道题一样了.题解可以看这里. 然后必须选或者不选的话,就直接把相应的点权变成\(- ...

  9. 火焰图分析CPU性能问题

    1.找出应用程序或内核消耗CPU的PID 2.执行perf record 命令,记录该PID的行为 perf record -a -g -p 14851 -- sleep 30 --30秒后退出 3. ...

  10. centos7配置外网

    1设置网络连接中的NAT网络配置 2虚拟机的网络设置选择NAT连接设置如下,子网IP可通过ipconfig查看本地VMnet8,如我本地VMnet8 ip为:192.168.198.0 3 3.开启虚 ...