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编程学习笔记相关推荐

  1. 15Java网络编程学习笔记

    Java网络编程学习笔记 文章目录 1 网络基础 1.1 网络通信 1.2 网络 1.3 IP地址 1.5 域名 1.6 端口号 1.7 网络通信协议 1.8 TCP协议 1.9 UDP协议 2 In ...

  2. Linux与C++11多线程编程(学习笔记)

    多线程编程与资源同步 在Windows下,主线程退出后,子线程也会被关闭; 在Linux下,主线程退出后,系统不会关闭子线程,这样就产生了僵尸进程 3.2.1创建线程 Linux 线程的创建 #inc ...

  3. Cocoa编程学习笔记一

    Cocoa编程学习笔记一 一.Cocoa的起源 Mac OS X的窗口服务器与UNIX中的X窗口服务器具有相同的功能:从用户那里接受事件,并将时间转发给应用程序,将应用程序发过来的数据显示在屏幕上.N ...

  4. 多线程编程学习笔记——使用并发集合(三)

    接上文 多线程编程学习笔记--使用并发集合(一) 接上文 多线程编程学习笔记--使用并发集合(二) 四.   使用ConcurrentBag创建一个可扩展的爬虫 本示例在多个独立的即可生产任务又可消费 ...

  5. WCF服务编程 学习笔记(1)

    你或许可以使用某一技术实现某些功能,可以按着指定的要求,完成特定的功能,实现某一想要的效果,这表示你可以使用该技术,会使用该技术,但是我们不能停留在使用的层次上,还要了解它们的运行机制,可能有点深了, ...

  6. [Linux网络编程学习笔记]索引

    一.Linux基本知识 [学习笔记]Linux平台的文件I/O操作 [学习笔记]Linux平台的文件,目录及操作 [Linux学习笔记]标准输入输出 [Linux学习笔记]进程概念及控制 [Linux ...

  7. Lua 编程学习笔记

    文章目录 Lua 编程学习笔记 一.环境安装 二.Lua 基本语法 1. 注释 2. 标识符 3. 变量 4. 数据类型 5. Lua 运算符 三.循环与流程控制 1. 循环 2. 流程控制 四.函数 ...

  8. shell脚本编程学习笔记6(xdl)——字符串截取命令

    shell脚本编程学习笔记6--字符串截取命令 1,cut命令 [root@localhost ~]# cut [选项] 文件名-f 列号,表示提取第几列-d 分隔符,按照指定的分隔符分割列注意:默认 ...

  9. shell脚本编程学习笔记1(xdl)——shell基础与Bash基本功能()

    shell脚本编程学习笔记1--shell基础与Bash基本功能 1,简介: 1,Shell就是一个命令行解释器,用以连接输入设别和内核. 2,Shell是解 释执行的脚本语言,在Shell中可以直接 ...

  10. SHELL编程学习笔记

    SHELL编程学习笔记 本文描述unix shell的各种应用实例,根据查阅资料和自我总结,作为自己今后复习的模板.本文搜集整理常用的shell应用实例,以例子详述unixshell部分命令的使用,着 ...

最新文章

  1. Java applet java.lang.OutOfMemoryError: Java heap space
  2. Zookeeper分布式集群部署
  3. 【Qt】Qt布局管理器
  4. 一次CMS GC问题排查过程(理解原理+读懂GC日志)
  5. nagios安装配置pnp4nagios-0.6.6
  6. golang xorm框架对应pg数据库字段类型参照表
  7. 苹果确认部分iPad Air 3会出现永久性黑屏:可免费维修
  8. javascript 无法修改 数组中对象_如何使用JavaScript中的Date对象
  9. python多进程优化for循环_Python中for循环中的多进程处理和传递多个参数
  10. (html字体图片纯css插件)Font Awesome
  11. 基于android的电子词典设计_基于安卓Android电子词典移动客户端APP设计(AndroidStudio,SQLit...
  12. 最全Pycharm教程(5)——Python快捷键相关设置
  13. 如何写一篇学术研讨会级的论文
  14. cs系统的服务器地址,《反恐精英CS》服务器地址
  15. Unity3D场景转换效果
  16. web端第三方微信登录
  17. 有哪些能给视频加特效字幕的软件?试试这几种简单方法
  18. python 数据分析、挖掘与可视化 day3
  19. aspnet+sqlserver同学录校友录网站系统
  20. linux查询hba卡命令,如何在Linux/Unix平台查看HBA卡的WWN号

热门文章

  1. HBase常用Shell命令详解
  2. DSA_常用10种算法(java数据结构与算法)
  3. java.io.IOException: http://XXX provided port:50000 is not reachable
  4. matlab55中值滤波,基于MATLAB的中值滤波算法实现
  5. 【Zigbee】进阶篇(1) Zigbee协议栈创建简单项目,协议栈、事件、消息学习
  6. 下载ts流视频的成功方法
  7. 指数函数及其性质教学设计
  8. 传动系统结构简图_液压传动系统结构示意图画图技巧(攻略)
  9. 企业如何建立强大的绩效管理系统
  10. javaeye API