永发信息网

文件io和标准io有什么区别

答案:1  悬赏:70  手机版
解决时间 2021-02-18 22:15
文件io和标准io有什么区别
最佳答案
标准IO与文件IO 的不同之处,先来说说标准IO:标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性。标准IO库处理很多细节。例如缓存分配,以优化长度执行IO等。标准的IO提供了三种类型的缓存。
(1)全缓存:当填满标准IO缓存后才进行实际的IO操作。 (2)行缓存:当输入或输出中遇到新行符时,标准IO库执行IO操作。 (3)不带缓存:stderr就是了。
文件IO:文件IO称之为不带缓存的IO(unbuffered I/O)。不带缓存指的是每个read,write都调用内核中的一个系统调用。也就是一般所说的低级I/O——操作系统提供的基本IO服务,与os绑定,特定于linix或unix平台。
2不同的地方
首先:两者一个显著的不同点在于,标准I/O默认采用了缓冲机制,比如调用fopen函数,不仅打开一个文件,而且建立了一个缓冲区(读写模式下将建立两个缓冲区),还创建了一个包含文件和缓冲区相关数据的数据结构。低级I/O一般没有采用缓冲,需要自己创建缓冲区,不过其实在linix或unix系统中,都是有使用称为内核缓冲的技术用于提高效率,读写调用是在内核缓冲区和进程缓冲区之间进行的数据复制。
其次从操作的设备上来区分,文件I/O主要针对文件操作,读写硬盘等,它操作的是文件描述符,标准I/O针对的是控制台,打印输出到屏幕等,它操作的是字符流。对于不同设备得特性不一样,必须有不同api访问才最高效。
软件开发专业网关注,其实最重要的还是他们各自的函数了;
1.fopen与open
标准I/O使用fopen函数打开一个文件:
FILE* fp=fopen(const char* path,const char *mod)
其中path是文件名,mod用于指定文件打开的模式的字符串,比如"r","w","w+","a"等等,可以加上字母b用以指定以二进制模式打开(对于 *nix系统,只有一种文件类型,因此没有区别),如果成功打开,返回一个FILE文件指针,如果失败返回NULL,这里的文件指针并不是指向实际的文 件,而是一个关于文件信息的数据包,其中包括文件使用的缓冲区信息。
文件IO使用open函数用于打开一个文件:
int fd=open(char *name,int how);
与fopen类似,name表示文件名字符串,而how指定打开的模式:O_RDONLY(只读),O_WRONLY(只写),O_RDWR (可读可写),还有其他模式请man 2 open。成功返回一个正整数称为文件描述符,这与标准I/O显著不同,失败的话返回-1,与标准I/O返回NULL也是不同的。
2.fclose与close
与打开文件相对的,标准I/O使用fclose关闭文件,将文件指针传入即可,如果成功关闭,返回0,否则返回EOF比如:
if(fclose(fp)!=0) printf("Error in closing file");
而文件IO使用close用于关闭open打开的文件,与fclose类似,只不过当错误发生时返回的是-1,而不是EOF,成功关闭同样是返回0。C语言用error code来进行错误处理的传统做法。
3. 读文件,getc,fscanf,fgets和read
标 准I/O中进行文件读取可以使用getc,一个字符一个字符的读取,也可以使用gets(读取标准io读入的)、fgets以字符串单位进行读取(读到遇 到的第一个换行字符的后面),gets(接受一个参数,文件指针)不判断目标数组是否能够容纳读入的字符,可能导致存储溢出(不建议使用),而fgets使用三个参数: char * fgets(char *s, int size, FILE *stream);
第一个参数和gets一样,用于存储输入的地址,第二个参数为整数,表示输入字符串的最大长度,最后一个参数就是文件指针,指向要读取的文件。最 后是fscanf,与scanf类似,只不过增加了一个参数用于指定操作的文件,比如fscanf(fp,"%s",words)文件IO中使用read函数用于读取open函数打开的文件,函数原型如下:
ssize_t numread=read(int fd,void *buf,size_t qty);
其中fd就是open返回的文件描述符,buf用于存储数据的目的缓冲区,而qty指定要读取的字节数。如果成功读取,就返回读取的字节数目(小于等于qty)
4. 判断文件结尾
如果尝试读取达到文件结尾,标准IO的getc会返回特殊值EOF,而fgets碰到EOF会返回NULL,而对于*nix的read函数,情况有所不 同。read读取qty指定的字节数,最终读取的数据可能没有你所要求的那么多(qty),而当读到结尾再要读的话,read函数将返回0.
5. 写文件:putc,fputs,fprintf和write
与读文件相对应的,标准C语言I/O使用putc写入字符,比如:
putc(ch,fp);
第一个参数是字符,第二个是文件指针。而fputs与此类似:
fputs(buf,fp);
仅仅是第一个参数换成了字符串地址。而fprintf与printf类似,增加了一个参数用于指定写入的文件,比如:
fprintf(stdout,"Hello %s.\n","dennis");
切记fscanf和fprintf将FILE指针作为第一个参数,而putc,fputs则是作为第二个参数。
在文件IO中提供write函数用于写入文件,原型与read类似:
ssize_t result=write(int fd,void *buf ,size_t amt);
fd是文件描述符,buf是将要写入的内存数据,amt是要写的字节数。如果写入成功返回写入的字节数,通过result与amt的比较可以判断是否写入正常,如果写入失败返回-1
6. 随机存取:fseek()、ftell()和lseek()
标准I/O使用fseek和ftell用于文件的随机存取,先看看fseek函数原型
int fseek(FILE *stream, long offset, int whence);
第一个参数是文件指针,第二个参数是一个long类型的偏移量(offset),表示从起始点开始移动的距离。第三个参数就是用于指定起始点的模式,stdio.h指定了下列模式常量:
SEEK_SET 文件开始处 SEEK_CUR 当前位置 SEEK_END 文件结尾处
看几个调用例子: fseek(fp,0L,SEEK_SET); //找到文件的开始处 fseek(fp,0L,SEEK_END); //定位到文件结尾处 fseek(fp,2L,SEEK_CUR); //文件当前位置向前移动2个字节数
而ftell函数用于返回文件的当前位置,返回类型是一个long类型,比如下面的调用:
fseek(fp,0L,SEEK_END);//定位到结尾 long last=ftell(fp); //返回当前位置
那么此时的last就是文件指针fp指向的文件的字节数。
与标准I/O类似,*nix系统提供了lseek来完成fseek的功能,原型如下:
off_t lseek(int fildes, off_t offset, int whence);
fildes是文件描述符,而offset也是偏移量,whence同样是指定起始点模式,唯一的不同是lseek有返回值,如果成功就 返回指针变化前的位置,否则返回-1。whence的取值与fseek相同:SEEK_SET,SEEK_CUR,SEEK_END,但也可以用整数 0,1,2相应代替。
以上就是标准IO与文件IO 的不同之处,软件开发专业网与大家共同的发展。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
急!请问安徽师范大学与安徽师范大学皖南学院
流行性脑脊髓膜炎的典型表现是A.黏液脓血便B.
抽血检查总蛋白低咋办
网购分期付款怎么付,用什么卡,是每个月打钱
在烈火雄心中谁是第一主角?
矮个子女生这个冬天应该怎么穿衣服,怎么搭配
洗新的内衣总觉的手上有油
晨光文具(小树林店)在什么地方啊,我要过去处
冒险岛 剑豪疾风五月雨刃怎么放不出
【海伦凯勒】海伦凯勒课文主要内容
Y·H在什么地方啊,我要过去处理事情
我被QQ好友删除了,好友里面没有了他的头像,
我想把一台瑞凌三相380伏的电子电焊机改成220
第七街1973我想知道这个在什么地方
日敦读音是什么
推荐资讯
北京鼎泰伟业装饰工程有限公司地址在哪,我要
我的名字叫刘振义好不好
陈某一家住在河东区,户籍在河西区,根据《廉
陈佰冲地址有知道的么?有点事想过去
青岛有什么特产可以带走的
我是玩网络游戏的,我玩的职业是战士。大家给
想买一个男式的包,1000元左右的,什么牌子的
曾记老昆明小吃在哪里啊,我有事要去这个地方
造梦西游3怎么用修改器得玉净瓶阳碎片
台式机上的网线直接插笔记本上能用吗?还是得
华山路/春晖街(路口)我想知道这个在什么地方
洛阳市鹏驰工贸有限公司在哪里啊,我有事要去
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?