标准IO函数以及基本知识点总结

什么是标准IO呢?有哪些特点?

标准IO是标准c库提供的对文件操作的函数接口。他的特点是:1 带缓存,2 大部分都调用系统接口函数实现。(c库就是一种实现好的函数接口,作用是屏蔽下层细节,提供上层接口,提高移植性)

我们都知道标准IO是带有缓存的,那么缓存分为几种呢?

1>全缓存:

有4096byte,截止条件有三,一是缓存满的时候,二是调用fflush的时候,三是进程正常结束的时候

2>行缓存:

有1024byte,它与全缓存截止的条件最大的差异就是另外遇到‘\n‘的时候。

3>不缓存:

0byte,每次都是直接调用系统接口。

那么说道标准IO就一定要提到   流   了,什么是流?

流 就是将要操作文件的地址,对一个文件操作,首先肯定要打开一个文件,所以流就是在调用fopen函数时所返回的分配内存的首地址,当然也就是将操作文件的地址。

标准IO的几个常用函数:

1》fopen()

函数原型 FILE *fopen(const char *path,const char *mode);

其中,path是我们要打开的流,而mode就是我们打开文件的方式了,也就决定你所打开的文件将被怎样的去对待啦,有如下几种方式:

"r":只读方式打开,打开的文件必须存在。

"r+"  :读写方式打开,文件必须存在。

"w" : 只写方式打开,文件不存在则创建,文件存在则清空。

"w+" : 读写方式打开,文件不存在则创建,文件存在则清空。

"a" :  只写方式打开,追加的方式写到文件的尾部,文件不存在则创建。

"a+": 读写方式打开,文件不存在创建,从头开始读,从尾开始写。

以上就是常用的fopen的打开方式,这个必须尽量的熟记于心,才能挥斥方遒,游刃有余(诗性大发了)。。。

2》单个字符的读写函数fgetc()   fputc()

int fgetc(FILE *stream)   

函数功能:从指定的流中读取一个字符, 成功返回读取的字符,读到文件结尾或者失败则返回EOF(-1)

这里面需要注意的就是,返回的数值是整形的,想想为什么呢? 呵呵 。。想不通的留言给我哈O(∩_∩)O哈!

int fputc(int c,FILE* stream)

函数功能: 向指定的流中写入一个字符。成功返回写入的字符,失败返回EOF.

3>多个字符的读写函数fgets()  fputs()

char * fgets(char *s,int size,FILE *stream)  

函数功能:从流中最多读取size-1个字符到s保存的地址,成功返回读入字符串的地址,失败或读到文件的尾部则返回NULL,为什么最多读取  size -1 个字符呢?  首先fgets函数遇到换行符的时候就会自动停止,所以我们也可以利用这一点,来统计文件的行数,另外每次读取结束的时候,会自动的在字符的后面加上一个‘\0‘,这就是问题的答案,你造吗?

int fputs( const char *s,FILE*stream)

   函数功能: 将一个字符串写入文件,s为字符串的首地址,stream为将要写进去的文件。成功则返回写入字符的个数,失败返回-1 ,   他的特点是 将字符串写入文件的时候,遇到‘\0‘ ,字符则结束。

4》fread()  fwrite()

size_t  fread(void *ptr,size_t size,size_t  nmemb,FILE*stream)

功能:从一个指定的流中读取nmemb个对象,每个对象的大小事size个字节,成功返回读取实际对象的个数(nmemb)  ,   失败返回0.

  size_t fwrite(const  void  *ptr ,size_t  size,size_t  nmemb , FILE*stream)

功能:向一个指定的流中写nmemb个对象。

另外,当我们在读或者写文件的时候,内核中的文件表项中会存在有offset值,它的值记录的是对文件相应操作的位置,位置很重要的,比如你对一个文件 读或写之后,然后对文件开始写或读,你如果在这个中间没有更新你的offset值,或导致你的操作得不到你最终想要到那个结果,所以offset的值至关重要,在程序中我们可以使用fseek这个函数来实施对offset值得修改设定,

int fseek ( FILE*stream,long offset,int whence)

功能:实现文件定位,更改内核中文件表项offset的值,成功返回0,失败返回-1.

long offset 来设定偏移量,正数代表向后偏移,负号则向前偏移,whence有三个值:SEEK_SET表示从头开始,SEEK_CUR表示从当前的位置,SEEK_END表示从尾部开始。

另外再添加一个:

文件描述符:

文件描述符是由无符号整数表示的,进程用它来标示打开的文件,内核利用文件描述符来访问文件,打开现存文件或新建文件时,内核会返回一个文件描述符,读写文件也需要使用文件描述符来指定待写的文件。

通常,标准输入的文件描述符是 0 ,标准输出的文件描述符是1 ,标准出错的文件描述符是2,接下来如果再打开文件的时候,文件描述符的分配原则就是未使用的最小的数字,

根据传说:

基于文件描述符的操作是linux中最常用的操作之一

     

标准IO函数以及基本知识点总结

时间: 2025-01-11 17:28:26

标准IO函数以及基本知识点总结的相关文章

UNIX高级环境编程(7)标准IO函数库 - 二进制文件IO,流定位,创建临时文件和内存流

? 1 二进制IO(Binary IO) 在前一篇我们了解了逐字符读写和逐行读写函数. 如果我们在读写二进制文件,希望以此读写整个文件内容,这两个函数虽然可以实现,但是明显会很麻烦且多次循环明显效率很低. 为了应对这种场景,标准IO库提供了fread和fwrite函数. 函数声明: #include <stdio.h> size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp); size_t fw

linux标准io的copy

---恢复内容开始--- 1.linux标准io的copy #include<stdio.h> int main(int argc,char **argv) { if(argc<3) { printf("use:mycp file1 file2\n"); return -1; } FILE *src=fopen(argv[1],"r");//打开源文件 if(src==NULL) { printf("no file!\n");

嵌入式 Linux系统编程(三)——标准IO库

嵌入式 Linux系统编程(三)--标准IO库 与文件IO函数相类似,标准IO库中提供的是fopen.fclose.fread.fwrite等面向流对象的IO函数,这些函数在实现时本身就要调用linux的文件IO这些系统调用. 一.标准IO库函数的缓冲机制 由于IO设备的访问速度与CPU的速度相差好几个数量级,为了协调IO设备与CPU的速度的不匹配,对于块设备,内核使用了页高速缓存,即数据会先被拷贝到操作系统内核的页缓存区中,然后才会从操作系统内核的缓存区拷贝到应用程序的地址空间. 当应用程序尝

《UNIX环境高级编程》--5 标准IO库

标准IO库 流和 FILE对象 标准IO库与文件IO区别: 标准IO库处理很多细节,如缓冲区分片.以优化的块长度执行IO等. 文件IO函数都是围绕文件描述符进行.首先打开一个文件,返回一个文件描述符:后续的文件IO操作都使用该文件描述符 标准IO库是围绕流进行的.当用标准IO库打开或者创建一个文件时,就有一个内建的流与之相关联 标准IO库的函数很多都是以 f开头,如fopen.fclose 对于ASCII字符集,一个字符用一个字节表示:对于国际字符集,一个字符可以用多个字节表示. 标准IO文件流

带标准IO带缓存区和非标准IO 遇到fork是的情况分析

废话不多说 直接代码 #include<stdio.h> #include<sys/types.h> #include<unistd.h> #include<stdlib.h> int globvar = 88; char buf[] = "a write to stdout\n"; int main() { int var = 10; pid_t pid ; //write 该函数是不带缓冲区的非标准函数 if(write(STDOUT

标准C IO函数和 内核IO函数 效率(时间)比较

前言 标准C提供的文件相关的IO函数,除标准错误输出是不带缓冲的(可以尽快的将错误消息显示出来)之外,所有与终端相关的都是行缓冲,其余都是全缓冲的. 我们可以使用setbuf,setvbuf改变指定流的缓冲类型. 原型: void setbuf(FILE *stream, char *buf);int setvbuf(FILE *stream, char *buf, int mode, size_t size); //成功返回0,失败非0 函数的用法一目了然,当参数buf指定为NULL时,操作系

文件IO函数和标准IO库的区别

摘自 http://blog.chinaunix.net/uid-26565142-id-3051729.html 1,文件IO函数,在Unix中,有如下5个:open,read,write,lseek,close.称之为不带缓存的IO(unbuffered I/O).不带缓存指的是每个read,write都调用内核中的一个系统调用. 2,标准IO库,由ANSI C标准说明.标准IO库处理很多细节.例如缓存分配,以优化长度执行IO等.标准的IO提供了三种类型的缓存. (1)全缓存:当填满标准IO

内核IO和标准IO

对于文件的读写操作函数在执行的空间来分,可以分为内核IO(主要在内核中运行)和标准IO(主要在用户空间中运行). 内核IO需要自己创建和管理缓存,而标准IO是自动分类缓存,一般来说,内核IO的效率高于标准IO,但是差距不是很大,考虑移植性,还是建议使用标准IO(只要是支持标准C语言就支持标准IO). 无论是标准IO还是内核IO都是对文件的信息,读写文件的指针进行记录的,调用相应的函数可以进行文件信息的读取和指针的修改. 以下为IO相关的函数的头文件,使用,参数,返回值的说明 linux C语言I

第一天20150829:标准IO 和 系统IO -----stdio and sysio

IO 的实现包括两种实现: 1.stdio标准IO 2.sysio系统IO IO的两种实现方式正常都可以使用.但是,在使用的过程中优先使用stdio标准IO. 首先要了解这两种实现的原理: 1.sysio系统IO:我们作为USER 要与内核对话,那么系统为我们提供了一个sysio,可以直接对话KERNAL. 那么问题就产生了:如果USER使用的平台环境不一样(有的人有linux,有的人用windows),那么由于KERNAL不一样,那么提供给USER的sysio也会不一样 2.所以引申出来一个标