Linux系统编程(第三章) 标准IO

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第三章:标准I/O目标:本章旨在向学员介绍Linux系统I/O相关函数的使用:1)掌握I/O相关函数的特点及使用方法2)了解I/O与系统调用相关的函数之间的区别时间:3学时教学方法:讲授PPT3.1关于标准I/O库功能功能标准I/O库的主要目的是提供高效的、扩展的和快捷的文件访问方式。区别区别库提供了比系统调用更多的功能函数,例如格式化输出和数据转变等。特点特点标准库是快捷的,不固定哪一个操作系统,实际上它已经成为独立与UNIX/LINUX系统外C语言的ANSI标准的一部分3.2文件操作标准I/O库中有下列库函数:fopen、fclosefread、fwritefflushfseekfgetc、getc、getcharfputc、putc、putcharfgets、getsprintf、fprintf和sprintfscanf、fscanf和sscanf3.2.1文件操作•fopen函数类似与底层的open系统调用。主要用于文件的输入输出filename指定打开的文件mode参数:“r”或“rb”:以只读方式打开文件“w”或“wb”::以写方式打开,并把文件长度截短为零“a”或“ab”:以写方式打开,新内容追加在文件尾“r+”或“rb+”或“r+b”:以修改方式打开(读和写)“w+”或“wb+”或“w+b”:以修改方式打开,并把文件长度截短为零“a+”或”ab+“或”a+b“:以修改方式打开,新内容追加在文件尾#includestdio.hFILE*fopen(constchar*filename,constchar*mode);3.2.1文件操作•fclose函数关闭指定的文件流stream,使所有尚未写出的数据都写出。#includestdio.hintfclose(FILE*stream);3.2.1文件操作•fopen例程:#includestdio.hintmain(){FILE*fp;fp=fopen(file,w);fclose(fp);return0;}3.2.1文件操作•fflush函数把文件流里所有未写出的数据立刻写出。#includestdio.hintfflush(FILE*stream);3.2.1文件操作•fflush例程:voidflush(FILE*stream){intduphandle;fflush(stream);duphandle=dup(fileno(stream));close(duphandle);}#includestring.h#includestdio.h#includeconio.h#includeio.hvoidflush(FILE*stream);intmain(void){FILE*stream;charmsg[]=Thisisatest;stream=fopen(DUMMY.FIL,w);fwrite(msg,strlen(msg),1,stream);clrscr();printf(PressanykeytoflushDUMMY.FIL:);getch();flush(stream);printf(\nFilewasflushed,Pressanykeytoquit:);getch();return0;}3.2.1文件操作•fread函数从一个文件流里读取数据。数据从文件流stream读到ptr指定的数据缓冲区里,函数返回值是成功读到数据缓冲区里的记录个数(不是字节数)size参数指定每个数据记录的长度nitems给出要传输的记录个数#includestdio.hsize_tfread(void*ptr,size_tsize,size_tnitems,FILE*stream);3.2.1文件操作•fwrite函数从指定的缓冲区里读取数据记录,并把他们写到输出流中,返回值为成功写入的记录个数。#includestdio.hsize_tfwrite(constvoid*ptr,size_tsize,size_tnitems,FILE*stream);3.2.1文件操作•fseek函数与lseek系统调用等价的文件流函数。它在文件流里为下一次读写操作指定位置,但函数返回值是一个整数,表示成功与否#includestdio.hintfseek(FILE*stream,longintoffset,intwhence);3.2.1文件操作例程:#includestring.h#includestdio.hintmain(void){FILE*stream;charmsg[]=thisisatest;charbuf[20];if((stream=fopen(DUMMY.FIL,w+))==NULL){fprintf(stderr,Cannotopenoutputfile.\n);return1;}fwrite(msg,strlen(msg)+1,1,stream);fseek(stream,0,SEEK_SET);fread(buf,1,strlen(msg)+1,stream);printf(%s\n,buf);fclose(stream);return0;}3.2.1文件操作•fgets、getc和getchar函数从文件流里读取下一个字节并把它作为一个字符返回。当达到文件尾时,返回EOF。#includestdio.hintfgetc(FILE*stream);intgetc(FILE*stream);intgetchar();3.2.1文件操作•fputc、putc和putchar函数把一个字符写到一个输出文件流中。返回写入的值,如果失败,返回EOF。#includestdio.hintfputc(intc,FILE*stream);intputc(intc,FILE*stream);intputchar(intc);3.2.1文件操作•fgets和gets函数从输入文件流stream里读取一个字符串。#includestdio.hchar*fgets(char*s,intn,FILE*stream);char*gets(char*s);3.2.2格式化输入输出•printf、fprintf和sprintf函数能够对各种不同类型的参数进行格式编排和输出。每个参数在输出流中的表示形式是由格式参数format控制的#includestdio.hintprintf(constchar*format,…);intsprintf(char*s,constchar*format,…);intfprintf(FILE*stream,constchar*format,…);3.2.2格式化输入输出•scanf、fscanf和sscanf函数从一个文件流读取数据,并把数据值放到传递过来的指针参数指向的地指出的变量中。#includestdio.hintscanf(constchar*format,…);intfscanf(FILE*stream,constchar*format,…);intsscanf(constchar*s,constchar*format,…);3.2.3其他流函数•remove函数相当于unlink函数,但如果它的path参数是一个目录的话,作用相当于rmdir函数#includestdio.hintremove(char*filename);3.2.3其他流函数•remove例程:#includestdio.hintmain(void){charfile[80];printf(Filetodelete:);gets(file);if(remove(file)==0)printf(Removed%s.\n,file);elseperror(remove);return0;}3.2.3其他流函数•fgetpos函数获得文件流的当前(读写)位置•fsetpos函数设置文件流的当前(读写)位置#includestdio.hintfgetpos(FILE*fp,fpos_t*pos);intfsetpos(FILE*fp,constfpos_t*pos);3.2.3其他流函数•fgetpos例程:#includestring.h#includestdio.hintmain(void){FILE*stream;charstring[]=Thisisatest;fpos_tfilepos;stream=fopen(DUMMY.FIL,w+);fwrite(string,strlen(string),1,stream);fgetpos(stream,&filepos);printf(Thefilepointerisatbyte%ld\n,filepos);fclose(stream);return0;}3.2.3其他流函数•ftell函数返回文件流当前(读写)位置的偏移值•rewind函数重置文件流里的读写位置#includestdio.hlongftell(FILE*fp);voidrewind(FILE*fp);3.2.3其他流函数•setbuf函数设置文件流的缓冲区•setvbuf函数设置文件流的缓冲机制setbufbuf参数:设置用户缓冲区大小,如果为NULL关闭缓冲区setvbufmode参数:_IOFBF完全缓冲_IOLBF线性缓冲_IONBF不缓冲#includestdio.hvoidsetbuf(FILE*fp,char*buf);intsetvbuf(FILE*fp,char*buf,intmode,size_tsize);3.2.3其他流函数•setbuf例程:#includestdio.hcharoutbuf;intmain(void){setbuf(stdout,outbuf);puts(Thisisatestofbufferedoutput.\n\n);puts(Thisoutputwillgointooutbuf\n);puts(andwon'tappearuntilthebuffer\n);puts(fillsuporweflushthestream.\n);fflush(stdout);return0;}3.2.3其他流函数•setvbuf例程#includestdio.hintmain(void){FILE*input,*output;charbufr[512];input=fopen(file.in,r+b);output=fopen(file.out,w);if(setvbuf(input,bufr,_IOFBF,512)!=0)printf(failedtosetupbufferforinputfile\n);elseprintf(buffersetupforinputfile\n);if(setvbuf(output,NULL,_IOLBF,132)!=0)printf(failedtosetupbufferforoutputfile\n);elseprintf(buffersetupforoutputfile\n);fclose(input);fclose(output);return0;}3.2.3其他流函数•freopen函数重新使用一个文件流•fdopen函数将文件描述符转为文件流#includestdio.hFILE*freopen(constchar*pathname,constchar*type,FILE*fp);FILE*fdopen(intfildes,constchar*type);3.2.3其他流函数•freopen例程#includestdio.hintmain(void){if(freopen(“file.out,w,stdout)==NULL)fprintf(stderr,errorredirectingstdout\n);printf(Thiswillgointoafile.

1 / 30
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功