标准Io编程学习笔记
IO编程 :对文件的输入和输出的操作
具体内容:
标准(带缓冲)IO编程 -----//利用C库中的函数实现文件操作
时间编程 ------//在程序中如何使用时间
文件(不带缓存)IO编程 ---- //利用linux系统中的底层函数实现文件操作
文件和目录属性
c库制作 ------//静态库和动态库
缓冲区的本质是一块存储区域。
标准(带缓冲)IO编程:
1,格式化标准IO编程 //输入与输出可以控制格式,printf(屏幕默认打开),scanf(键盘输入)
2,非格式化标准IO编程 //输入与输出没有格式化,以字节流写
标准IO经过 文件IO没有。
一,标准IO相关概念:
1,文件操作步骤:
第一步: 打开文件 fopen()(就是让程序和文件建立连接的过程。)
打开文件,返回文件指针:FILE*
例如:#include <stdio.h>
FILE *fopen(const char *pathname, const char *mode);
//参数1 ---- 要打开的文件名字(路径)
//参数2 ---- 打开的操作权限:
fopen() 会获取文件信息,包括文件名、文件状态、当前读写位置等,并将这些信息保存到一个 FILE 类型的结构体变量中,然后将该变量的地址返回。
第二步: 读写文件
r //只读,文件必须存在
FILE *fp = fopen("demo.txt", "r");
表示以“只读”方式打开当前目录下的 demo.txt 文件,并使 fp 指向该文件,这样就可以通过 fp 来操作 demo.txt 了。fp 通常被称为文件指针。
r+ //读写,文件必须存在
w //只写,文件不存在,则创建,文件存在,则把文件清空
w+ //写读,文件不存在,则创建,文件存在,则把文件清空
a //只写, 文件不存在,则创建,文件存在,则在文件末尾追加
a+ //写读, 文件不存在,则创建,文件存在,则在文件末尾追加,如果读则 从文件头开始读
//返回值 ---成功:文件指针,失败:NULL
第三步: 关闭文件 fclose()
文件一旦使用完毕,应该用 fclose() 函数把文件关闭,以释放相关资源,避免数据丢失。
int fclose(FILE *fp);
//参数 ---- 文件指针
//返回值 ----成功:0,失败:-1
//刷新缓冲区,释放缓冲区
文件正常关闭时,fclose() 的返回值为0,如果返回非零值则表示有错误发生。
2,定义:
文件:一组相关数据的有序集合。
文件名:这个数据集合的名称。
3,linux中文件分类:
(-)常规文件 ASCII码文件 二进制的文件
(d)目录
(c)字符设备
(b)块设备
(p)有名管道
(s)套接口
(l)符号连接
4,标准IO概念-介绍
不仅在UNIX系统,在很多操作系统上都实现了标准I/O库
标准I/O库由ANSI C标准说明
标准I/O库处理很多细节,如缓冲分配、以优化长度执行I/O等,这样使用户不必关心如何选择合适的块长度
标准I/O在系统调用函数基础上构造的,它便于用户使用
标准I/O库及其头文件stdio.h为底层I/O系统调用提供了一个通用的接口。
5,文件指针
FILE指针:每个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息,这些信息是保存在一个结构体类型的变量中,该结构体类型是由系统定义的,取名为FILE。
标准I/O库的所有操作都是围绕流(stream)来进行的,在标准I/O中,流用FILE *来描述。
标准I/O库是由Dennis Ritchie在1975年左右编写的
6,流(stream)
定义:所有的I/O操作仅是简单的从程序移进或者移出,这种字节流,就称为流。
分类:文本流/二进制流。
7,标准IO的缓冲
当程序和硬盘上的文件进行数据存取时,由于cpu速度比硬盘速度快很多,为了提高程序的效率,
在程序和文件之间创建一个缓冲区,程序可以先将数据写到缓冲区中,然后再一点一点刷新到文件中,这样能够程序效率。
在标准IO中,缓冲分为三种:
1--->全缓冲 ---- //操作常规文件的时候(对于磁盘文件通常使用全缓存访问)
全缓冲刷新的条件:
缓冲区满时
关闭文件时
强制刷新缓冲区
程序正常结束时
2--->行缓冲 ----- //操作标准输入和标准输出的时候(终端操作)
当运行一个程序时,系统会自动默认打开三个设备文件:
文件指针 设备
标准输入 (stdin) 键盘 0
标准输出 (stdout) 屏幕 1
标准错误输出 (stderr) 屏幕 2
行缓冲刷新的条件:
缓冲区满时
关闭文件时 // fclose()
强制刷新缓冲区 ------ //fflush(FILE * )
程序正常结束时
当缓冲区中遇到换行符('\n')时
3--->不带缓冲 ------ //操作标准错误输出的时候(stderr)
没有缓冲区刷新的条件,直到往缓冲区写数据,会立即刷新。
很多的人机交互界面要求不可全缓冲。(例如打游戏放技能)
标准出错决不会是全缓冲的。(perror)
例如:
int main(int argc,char **argv)
{
printf("helloworld"); //通过标准输出打印,行缓冲
fprintf(stderr,"hello world"); //通过标准错误输出打印,不带缓冲
while(1);
return 0;
}
二、格式化标准IO编程 ------//输入与输出可以控制格式,printf(),scanf()
1,格式化输出函数
int printf(const char *format, ...); //只能向标准输出写数据
int fprintf(FILE *stream, const char *format, ...); //向指定的文件中写数据
int sprintf(char *str, const char *format, ...); //输出结果以字符串形式写到内存中
int snprintf(char *str, size_t size, const char *format, ...); //输出结果以字符串形式写到内存中,同时限制 写的字符数,防止溢出
2,格式化输入函数
int scanf(const char *format, ...); //从标准输入(键盘)获取数据
int fscanf(FILE *stream, const char *format, ...); //从指定文件中获取数据
int sscanf(const char *str, const char *format, ...); //从内存中获取数据
三、非格式化标准IO编程 //输入与输出没有格式化,以字节流写
(1)一次一个字符的IO
1--->输入
int getc(FILE *stream); //(宏)从指定的文件中获取一次字符
int getchar(void); //默认从标准输入(键盘)获取一次字符
2--->输出
int fputc(int c, FILE *stream); //(函数)向指定的文件中写一个字符
int putc(int c, FILE *stream); //(宏)向指定的文件中写一个字符
int putchar(int c); //向标准输出写一个字符
(2)一次一行IO
//输入函数
char *fgets(char *s, int size, FILE *stream); //从指定文件中读取一行数据
//fgets()会连同一行后面的换行符一起读入
//参数1 ----- 内存地址
//参数2 ----- 内存大小
//参数3 ----- 要读取数据的文件的指针
char *gets(char *s); //默认从标准输入(键盘)获取一行数据
//输出函数
int fputs(const char *s, FILE *stream); //向指定的文件中写一行
int puts(const char *s); //默认向标准输出(屏幕)打印,在字符串后面会自动添加换行符
3,直接IO -----//字节流
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
//参数1 ----- 内存地址
//参数2 ----- 对象大小
//参数3 ----- 对象个数
//参数4 ----- 文件指针
4,定位文件指针
1》获取文件指针的位移量
long ftell(FILE *stream);
//参数 ----- 文件指针
//返回值 ----成功:文件指针的位移量,失败:-1
例子:
int main(int argc,char **argv)
{
FILE * fp;
char ch;
int i;
if(argc != 2){
fprintf(stderr,"Usage: %s <filename>\n",argv[0]);
exit(1);
}
if((fp = fopen(argv[1],"r")) == NULL){
perror("fopen");
exit(1);
}
for(i = 0; i < 7; i++){
ch = fgetc(fp);
printf("%c",ch);
}
printf("\n%ld\n",ftell(fp));
return 0;
}
2》修改文件指针的位置
int fseek(FILE *stream, long offset, int whence);
//参数1 ----- 文件指针
//参数2 ----- 偏移量(相对于whence的)
//参数3 ----- 表示参数2偏移的起始位置:
SEEK_SET --- 文件开头
SEEK_CUR --- 文件指针当前位置
SEEK_END --- 文件末尾
例子:
int main(int argc,char **argv)
{
FILE * fp;
char ch;
int i;
if(argc != 2){
fprintf(stderr,"Usage: %s <filename>\n",argv[0]);
exit(1);
}
if((fp = fopen(argv[1],"r")) == NULL){
perror("fopen");
exit(1);
}
#if 0
//修改文件指针位置,从第5个字符后开始读取数据
fseek(fp,5,SEEK_SET);
for(i = 0; i < 3; i++){
ch = fgetc(fp);
printf("%c",ch);
}
#else
//计算大小
int len;
fseek(fp,0,SEEK_END);
len = ftell(fp);
printf("len = %d\n",len);
#endif
return 0;
}
标准Io编程学习笔记相关推荐
- 15Java网络编程学习笔记
Java网络编程学习笔记 文章目录 1 网络基础 1.1 网络通信 1.2 网络 1.3 IP地址 1.5 域名 1.6 端口号 1.7 网络通信协议 1.8 TCP协议 1.9 UDP协议 2 In ...
- Linux与C++11多线程编程(学习笔记)
多线程编程与资源同步 在Windows下,主线程退出后,子线程也会被关闭; 在Linux下,主线程退出后,系统不会关闭子线程,这样就产生了僵尸进程 3.2.1创建线程 Linux 线程的创建 #inc ...
- Cocoa编程学习笔记一
Cocoa编程学习笔记一 一.Cocoa的起源 Mac OS X的窗口服务器与UNIX中的X窗口服务器具有相同的功能:从用户那里接受事件,并将时间转发给应用程序,将应用程序发过来的数据显示在屏幕上.N ...
- 多线程编程学习笔记——使用并发集合(三)
接上文 多线程编程学习笔记--使用并发集合(一) 接上文 多线程编程学习笔记--使用并发集合(二) 四. 使用ConcurrentBag创建一个可扩展的爬虫 本示例在多个独立的即可生产任务又可消费 ...
- WCF服务编程 学习笔记(1)
你或许可以使用某一技术实现某些功能,可以按着指定的要求,完成特定的功能,实现某一想要的效果,这表示你可以使用该技术,会使用该技术,但是我们不能停留在使用的层次上,还要了解它们的运行机制,可能有点深了, ...
- [Linux网络编程学习笔记]索引
一.Linux基本知识 [学习笔记]Linux平台的文件I/O操作 [学习笔记]Linux平台的文件,目录及操作 [Linux学习笔记]标准输入输出 [Linux学习笔记]进程概念及控制 [Linux ...
- Lua 编程学习笔记
文章目录 Lua 编程学习笔记 一.环境安装 二.Lua 基本语法 1. 注释 2. 标识符 3. 变量 4. 数据类型 5. Lua 运算符 三.循环与流程控制 1. 循环 2. 流程控制 四.函数 ...
- shell脚本编程学习笔记6(xdl)——字符串截取命令
shell脚本编程学习笔记6--字符串截取命令 1,cut命令 [root@localhost ~]# cut [选项] 文件名-f 列号,表示提取第几列-d 分隔符,按照指定的分隔符分割列注意:默认 ...
- shell脚本编程学习笔记1(xdl)——shell基础与Bash基本功能()
shell脚本编程学习笔记1--shell基础与Bash基本功能 1,简介: 1,Shell就是一个命令行解释器,用以连接输入设别和内核. 2,Shell是解 释执行的脚本语言,在Shell中可以直接 ...
- SHELL编程学习笔记
SHELL编程学习笔记 本文描述unix shell的各种应用实例,根据查阅资料和自我总结,作为自己今后复习的模板.本文搜集整理常用的shell应用实例,以例子详述unixshell部分命令的使用,着 ...
最新文章
- Java applet java.lang.OutOfMemoryError: Java heap space
- Zookeeper分布式集群部署
- 【Qt】Qt布局管理器
- 一次CMS GC问题排查过程(理解原理+读懂GC日志)
- nagios安装配置pnp4nagios-0.6.6
- golang xorm框架对应pg数据库字段类型参照表
- 苹果确认部分iPad Air 3会出现永久性黑屏:可免费维修
- javascript 无法修改 数组中对象_如何使用JavaScript中的Date对象
- python多进程优化for循环_Python中for循环中的多进程处理和传递多个参数
- (html字体图片纯css插件)Font Awesome
- 基于android的电子词典设计_基于安卓Android电子词典移动客户端APP设计(AndroidStudio,SQLit...
- 最全Pycharm教程(5)——Python快捷键相关设置
- 如何写一篇学术研讨会级的论文
- cs系统的服务器地址,《反恐精英CS》服务器地址
- Unity3D场景转换效果
- web端第三方微信登录
- 有哪些能给视频加特效字幕的软件?试试这几种简单方法
- python 数据分析、挖掘与可视化 day3
- aspnet+sqlserver同学录校友录网站系统
- linux查询hba卡命令,如何在Linux/Unix平台查看HBA卡的WWN号
热门文章
- HBase常用Shell命令详解
- DSA_常用10种算法(java数据结构与算法)
- java.io.IOException: http://XXX provided port:50000 is not reachable
- matlab55中值滤波,基于MATLAB的中值滤波算法实现
- 【Zigbee】进阶篇(1) Zigbee协议栈创建简单项目,协议栈、事件、消息学习
- 下载ts流视频的成功方法
- 指数函数及其性质教学设计
- 传动系统结构简图_液压传动系统结构示意图画图技巧(攻略)
- 企业如何建立强大的绩效管理系统
- javaeye API