文件操作大致分三步

  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. yii框架学习(MVC)

    路由:两种方式,第一种是默认方式访问,假设配置了虚拟主机,那么localhost/web/index.php?r=admin/index    访问的是controllers目录下的admin控制器里 ...

  2. jquery mouseenter()方法 语法

    jquery mouseenter()方法 语法 作用:当鼠标指针穿过元素时,会发生 mouseenter 事件.该事件大多数时候会与 mouseleave 事件一起使用.mouseenter() 方 ...

  3. [Flask]sqlalchemy使用count()函数遇到的问题

    sqlalchemy使用count()函数遇到的问题 在使用flask-sqlalchemy对一个千万级别表进行count操作时,出现了耗时严重.内存飙升的问题. 原代码: # 统计当日登陆次数 co ...

  4. 前端Web浏览器基于Flash如何实时播放监控视频画面(二)之Windows搭建(RTMP)流媒体服务器

    本片文章只是起到抛砖引玉的作用,能从头到尾走通就行,并不做深入研究.为了让文章通俗易懂,尽量使用白话描述. 0x001: 获取 流媒体服务器有很多,这里以nginx为例. nginx for Wind ...

  5. 【CUDA 基础】3.4 避免分支分化

    - title: [CUDA 基础]3.4 避免分支分化 categories: - CUDA - Freshman tags: - 规约问题 - 分支分化 toc: true date: 2018- ...

  6. 【CUDA 基础】3.3 并行性表现

    title: [CUDA 基础]3.3 并行性表现 categories: - CUDA - Freshman tags: - nvprof toc: true date: 2018-04-15 21 ...

  7. Spring——代理实现AOP

    一.静态代理实现 1.接口(抽象主题) 2.接口的实现类(真实主题) 3.代理类(代理主题) 4.测试类: ApplicationContext context=new ClassPathXmlApp ...

  8. Lucas(卢卡斯)定理

    Lucas定理 对于C(m,n)%P(P是质数)这样的问题,可以通过预处理阶乘和阶乘的逆元,来快速计算.但是当m,n大于P时,就不能保证m,n与P互质了,但不互质的情况下,乘法逆元不存在,此时就需要卢 ...

  9. 第一章 大体知道java语法1----------能写java小算法

    很多人开始学习java时,都是抱着诸如<Thinking in java>.<疯狂java>等书籍,从前到后慢慢翻看,不管其内容重要与否,也不关心自己以后能否使用到.我的建议是 ...

  10. getFieldDecorator用法(三)——Table增删改

    后台管理系统常用到表单的增删改,这里也做了个封装 例如:user/index.js import React from 'react' import { Card, Button, Table, Fo ...