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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。