标准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;

}

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

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340