一、基本概念
1、文件分类
普通文件:存放在硬盘中的文件
设备文件:屏幕、键盘等特殊文件

文本文件:ASCII文件,每个字节存放一个字符的ASCII码,打开文件看到的是文本信息
二进制文件:数据按其在内存中的存储形式原样存放,打开文件看到的是乱码

2、文件缓冲区(了解)
ANSI C(标准C语言库函数)标准采用“缓冲文件系统”处理数据文件。

写文件(设备文件除外),并不会直接写到文件中,会先放在缓冲区,默认情况下,关闭文件或缓冲区满了才写到文件。
如果没有关闭文件,缓冲区也没有满,可以通过程序正常结束,或者人为刷新缓冲区fflush(fd)来把缓冲区的内容写到文件中。

缓冲区了解一下即可,增加缓冲区只是为了提高效率,减少频繁交互的次数,我们写程序基本上不用关心。

二、读写文件步骤
1、打开文件
//定义文件指针
FILE *fp = NULL;
fopen("c:\\demo.txt", "w+"); //"c:\\demo.txt" windows有效
//"c:/demo.txt": 文件路径,可以是绝对路径和相对路径
//"w+": 打开权限,读写方式打开,文件不存在则创建,写内容时,会清空原来内容再写
//"r+":读写方式打开,文件不存在则报错
fp = fopen("./demo.txt", "w+"); // 45度 "c:/demo.txt" linux windows都可用
if (fp == NULL)
{
perror("fopen"); //打印错误信息
return;
}

默认情况下,VS, Qt相对路径说明:
1)编译代码时,相对路径相对于工程目录
2)直接点击可执行程序,相对路径相对于可执行程序

c语言中有三个特殊的文件指针无需定义、打开可直接使用:
stdin: 标准输入 默认为当前终端(键盘)
我们使用的scanf、getchar函数默认从此终端获得数据

stdout:标准输出 默认为当前终端(屏幕)
我们使用的printf、puts函数默认输出信息到此终端

stderr:标准出错 默认为当前终端(屏幕)
当我们程序出错或者使用: perror函数时信息打印在此终端

fputc('a', stdout); //stdout -> 屏幕, 打印普通信息

char ch;
ch = fgetc(stdin); //std -> 键盘
printf("ch = %c\n", ch);

//fprintf(stderr, "%c", ch ); //stderr -> 屏幕, 错误信息
fputc(ch, stderr);

2、读写文件
1、输出,即为写,把buf中的内容写到指定的文件中
2、输入,即为读,把文件中的内容取出放在指定的buf

3、关闭文件
fclose(fp);

二、读写文件
1、库函数的学习
1)包含所需头文件
2)函数名字
3)功能
4)参数
5)返回值

2、按照字符读写文件:fgetc()、fputc()
1)写文件
char *str = "111abcdefg12345678";
int i = 0;
for (i = 0; i < (int)strlen(str); i++)
{
//功能:往文件fp中写str[i],一个字符一个字符写
//参数:str[i]:写入文件的字符,fp:文件指针
//返回值:成功写入文件的字符,失败:-1
fputc(str[i], fp);
}

2)读文件
char ch;
//feof(fp)判断文件是否到结尾,已经到结尾返回值为非0,没有到结尾返回值为0
while ( !feof(fp) ) //如果文件没有结尾
{
//返回值:成功读取的字符
ch = fgetc(fp);
printf("%c", ch);
}

3、按照行读写文件:fputs()、fgets()
1)写文件

char *buf[] = { "11111111\n", "aaaaaaaaaaaa\n", "bbbbbbbbbbbb\n" }; //指针数组
int i = ;
for (i = ; i < ; i++)
{
//功能:往文件fp写入一行内容buf[i]
//参数:buf[i]:字符串首地址,fp:文件指针
//返回值:成功:0,失败:非0
fputs(buf[i], fp);
}

2)读文件

char buf[] = {};
//从文件中读取一行内容(以"\n"作为标志),放在buf中
//一次最大只能读sizeof(buf)-1,如果小于sizeof(buf)-1,则按实际大小读取
//然后在字符串结尾自动加上字符‘\0’(转换为C风格字符串)
//返回值:成功:读出的字符串,失败:NULL
if (fgets(buf, sizeof(buf), fp) != NULL)
{
printf("buf = %s", buf);
}

4、按照块读写文件:fread()、fwirte()
typedef struct Stu
{
char name[50];
int id;
}Stu;
Stu s[3];

1)写文件
//写文件,按块的方式写
//s:写入文件内容的内存首地址
//sizeof(Stu):块数据的大小
//3:块数, 写文件数据的大小 sizeof(Stu) *3
//fp:文件指针
//返回值,成功写入文件的块数目,不是数据总长度
int ret = fwrite(s, sizeof(Stu), 3, fp);
printf("ret = %d\n", ret);

2)读文件
//读文件,按块的方式读
//s:放文件内容的首地址
//sizeof(Stu):块数据的大小
//3:块数, 读文件数据的大小 sizeof(Stu) *3
//fp:文件指针
//返回值,成功读取文件内容的块数目,不是数据总长度
int ret = fread(s, sizeof(Stu), 3, fp);
printf("ret = %d\n", ret);

5、按照格式化进行读写文件:fprintf()、fscanf()
1)写文件
//格式化写文件
int a = 250;
int b = 10;
int c = 20;
//和printf()用法一样,只是printf是往屏幕(标准输出)写内容
//fprintf往指定的文件指针写内容
//返回值:成功:写入文件内容的长度,失败:负数
fprintf(fp, "Tom = %d, just like %d, it is %d", a, b, c);

2)读文件

int a, b, c;
fscanf(fp, "Tom = %d, just like %d, it is %d", &a, &b, &c);
printf("a = %d, b = %d, c = %d\n", a, b, c);

6、随机读写
//文件光标移动到文件结尾
//SEEK_SET:文件开头
//SEEK_CUR:文件当前位置
//SEEK_END:文件结尾
fseek(fp, 0, SEEK_END);

//获取光标到文件开头文件的大小ftell
long size = ftell(fp);

//文件光标恢复到开始位置
rewind(fp);

typedef struct Stu
{
char name[50];
int id;
}Stu;
Stu tmp; //读第3个结构体

//假如文件中写了三个结构体
//从起点位置开始,往后跳转2个结构体的位置
fseek(fp, 2*sizeof(Stu), SEEK_SET);
//从结尾位置开始,往前跳转一个结构体的位置
//fseek(fp, -1 * (int)sizeof(Stu), SEEK_END);
int ret = 0;
ret = fread(&tmp,sizeof(Stu), 1, fp);
if(ret == 1)
{
printf("[tmp]%s, %d\n", tmp.name, tmp.id);
}

//把文件光标移动到文件开头
//fseek(fp, 0, SEEK_SET);
rewind(fp);

三、综合案例
1、加密文件读写(使用别人写好的接口)
2、配置文件读写(自定义接口)

c提高第六次课 文件读取的更多相关文章

  1. phpspreadsheet 中文文档(六)读写文件+读取文件

    2019年10月11日14:05:58 读写文件 从体系结构您已经知道,使用基本PhpSpreadsheet类无法对持久性存储进行读写.为此,PhpSpreadsheet提供读者和作家,这是实现\Ph ...

  2. nowcoder 提高第六场A题

    Solution 60分 因为所有的字母要么全相同要么全不同, 所以两条路径比较字典序只需要比较第一条边就可以, 于是建反图, 在反图上按拓扑序转移就可以. 因为有环, 所以拓扑完入度还是不为0的点答 ...

  3. python第二十九课——文件读写(读取读取中文字符)

    演示:读取中文字符 结论: 1).如果不设置encoding,默认使用gbk进行编解码 2).如果编码和解码不一致,最终导致报错,但是一旦设置了errors='ingore',那么就不会报错,而采取乱 ...

  4. python练习六十三:文件处理,读取文件内容,按内容生成文件

    python练习六十三:文件处理 假设要读取code.txt文件中内容,code.txt文件内容如下 01 CN Chinese 02 US United States of America 03 J ...

  5. python练习六十一:文件处理,读取文件内容

    python练习六十一:文件处理,读取文件内容 假设要读取text.txt文件中内容 写文件(如果有文件,那直接调用就行,我这里自己先创建的文件) list1 = ['python','jave',' ...

  6. 风炫安全web安全学习第三十五节课 文件下载和文件读取漏洞

    风炫安全web安全学习第三十五节课 文件下载和文件读取漏洞 0x03 任意文件下载漏洞 一些网站由于业务需求,往往需要提供文件下载功能,但若对用户下载的文件不做限制,则恶意用户就能够下载任意敏感文件, ...

  7. centos linux系统日常管理3 服务管理ntsysv,chkconfig,系统日志rsyslog,last ,lastb ,exec,xargs,dmesg,screen,nohup,curl,ping ,telnet,traceroute ,dig ,nc,nmap,host,nethogs 第十六节课

    centos linux系统日常管理3  服务管理ntsysv,chkconfig,系统日志rsyslog,last ,lastb ,exec,xargs,dmesg,screen,nohup,cur ...

  8. Python编码/文件读取/多线程

    Python编码/文件读取/多线程 个人笔记~~记录才有成长   编码/文件读取/多线程 编码 常用的一般是gbk.utf-8,而在python中字符串一般是用Unicode来操作,这样才能按照单个字 ...

  9. Android提高第十二篇之蓝牙传感应用

        请问淘宝上买的单片机蓝牙模块与安卓/android手机通讯的时候需要设置UUID吗? 2013-02-15 09:39 在世张辽 | 浏览 2769 次 想用安卓手机和单片机通过蓝牙模块通讯, ...

随机推荐

  1. vue的父子组件间的相互传参props及props数据的多种验证机制

    感觉自己即将完全步入前端大军,后台老板都不需要我弄了,塞翁失马...时间会告诉我们是好是坏 好了言归正传,最近vue是搞的不亦乐乎啊,下面来总结一下vue组件间的各种使用方法以及一些技巧 ------ ...

  2. 【带着canvas去流浪(8)】碰撞

    目录 一. canvas的能力 二. 动画框架 三. 在canvas中模拟碰撞 3.1定义小球的属性 3.2 生成新的小球 3.3 帧动画绘制函数step 3.4 定义小球的update方法 3.5 ...

  3. PyCharm出现TabError: inconsistent use of tabs and spaces in indentation最简单实用的解决办法

    本文使用PyCharm的格式化代码功能解决TabError: inconsistent use of tabs and spaces in indentation. 当把代码从别处复制进来PyChar ...

  4. 企业级自动化运维工具---puppet详解

    本文收录在Linux运维企业架构实战系列 1.认识puppet 1.1 引入 puppet是什么,咱们先不用专业的名词解释它,咱们先描述一些工作场景,看明白这些工作场景,自然会知道puppet是什么. ...

  5. Linux文本三剑客超详细教程---grep、sed、awk

    awk.grep.sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单 ...

  6. Flutter 即学即用系列博客——09 EventChannel 实现原生与 Flutter 通信(一)

    前言 紧接着上一篇,这一篇我们讲一下原生怎么给 Flutter 发信号,即原生-> Flutter 还是通过 Flutter 官网的 Example 来讲解. 案例 接着上一次,这一次我们让原生 ...

  7. Asp.Net MVC Https设置

    1.   IIS设置 1.1 创建SSL证书 点击左侧菜单栏顶部,点击“功能视图”里的“服务器证书”: 点击“创建自动签名证书”创建自动签名证书: 1.2 设置SSL证书 点开网站,在“功能视图”里点 ...

  8. 【转】JavaSE面试题目收集

    1.是否可以从一个static方法内部发出对非static方法的调用? 不可以.当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用, ...

  9. Android破解学习之路(十五)—— 【Unity3D】洛菲斯的呼唤(Lophis roguelike)无限金币(道具)的实现 破解

    前言 之前玩月圆之夜玩的挺high的,最近又找到了个与月圆之夜类似的卡牌游戏,游戏名为Lophis roguelike,中文翻译名洛菲斯的呼唤. 但是这个与月圆之夜有所不同,如果失败了,只能从开头重新 ...

  10. Spring boot 发送邮件示例

    最近的一个项目中用到了邮件发送,所以研究了一下.将其总结下来. 首先 登录邮箱 -->设置-->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务--> ...