上一篇Linux编程学习笔记|LinuxIO学习[1]——文件IO,本人总结了Linux下的文件IO。文件IO是一种低级IO操作。在日常工作中,文件IO的使用频率还是比较低的。我们日常使用的printf()并不是文件IO,而是另一种IO——标准IO。在本文中,我将介绍Linux下的标准IO,并举例说明如何使用它们。标准IO库要使用标准IO库,您需要包含头文件。这个库为用户创建了一个通用接口来连接到底层系统调用。它是按ANSIC标准制定的库,因此具有可移植性(文件IO是基于Unix的POSIX标准,不能移植到Windows)。类似于文件IO,需要先打开一个文件,建立访问路径。文件IO的访问路径是通过文件描述符,而标准IO的访问路径是流(stream),实现为指向结构体FILE的指针。和文件IO类似,程序启动时也有3种默认的文件流:标准流变量或宏描述0stdin标准输入1stdout标准输出2stderr标准错误输出标准IO基本操作标准IO比文件IO功能多很多,这里我主要介绍介绍13个标准IO函数。打开/创建文件流fopen()类似于文件IO中的open()。它用于打开文件流。函数说明如下:FILE*fopen(constchar*restrictpathname,constchar*restrictmode);args:constchar*restrictpathname:文件的路径constchar*restrictmode:打开文件的方式return:返回指向文件的指针,如果指针不为NULL,则表示成功,如果指针为NULL,则表示失败。文件打开有6种模式:1."r"或"rb":以只读方式打开文件(文件必须存在)2."w"或"wb":以写入方式打开文件并截断??文件length为0或创建文件写入3."a"或"ab":打开文件写入并将内容写入文件末尾或创建文件4."r+"或"rb+"或"r+b":Openthefileforupdate(read/write)(fileMustexist)5."w+"or"wb+"or"w+b":Openthefileinanupdatedway(read/write)andtruncatethefile文件长度为0或创建文件6."a+"或"ab+"或"a+b":以更新方式(读/写)打开文件并将更新内容写入文件末尾或创建一个filefopen()与open()不同,fopen()在创建文件时不会改变文件的访问权限。关闭文件流fclose()类似于文件IO中的close()。它用于关闭文件流。函数说明如下:intfclose(FILE*stream);args:FILE*stream:指向已关闭文件的指针return:关闭文件成功返回0,关闭文件失败返回EOF。让我们看第一个例子,文件的打开和关闭:#includeintmain(intargc,char*argv[]){FILE*fp;//fp=fopen("stdio.log","r+");fp=fopen("stdio.log","w+");if(fp==NULL){printf("文件创建失败...\n");返回-1;}else{printf("文件创建成功...\n");}fclose(fp);返回0;}运行结果:新建文件stdio.log,输出Filecreatesuccess...如果注释掉第8行,取消注释第7行,则输出Filecreatefail...。修改文件流的读写偏移量fseek()类似于文件IO中的lseek(),用于修改文件流的读写偏移量,函数说明如下:intfseek(FILE*stream,longoffset,intwhence);args:FILE*stream:指向文件的文件指针longoffset:偏移量移动的距离intwhence:偏移量的基地址-SEEK_SET文件开头-SEEK_CUR当前位置ofthefile-SEEK_END文件末尾return:modifytheoffset如果值修改成功则返回0,如果offset修改失败则返回-1。whence为SEEK_CUR或SEEK_END时,offset可正可负。写文件流fwrite()fwrite()类似于文件IO中的write(),函数描述如下:size_tfwrite(constvoid*restrictptr,size_tsize,size_tnitems,FILE*restrictstream);args:constvoid*restrictptr:写入的数据存放在内存空间的地址size_tsize:单个元素的大小size_tnitems:写入的数据元素个数FILE*restrictstream:指向写入的文件指针file返回:实际写入的元素个数,非负整数表示成功,-1表示失败intfputs(constchar*restricts,FILE*restrictstream);args:constchar*restricts:写入的字符串FILE*restrictstream:指向写入文件的文件指针return:写入文件的状态,非负整数为成功,EOF为失败puts()puts()putscharacters字符串(不包括`\0`)被写入标准输出,并在行尾添加一个换行符。函数说明如下:intputs(constchar*s);args:constchar*s:writtenstringreturn:written到stdio的状态,非负整数表示成功,EOF表示失败字符FILE*stream:指向要写入文件的文件指针return:如果有没有错误,返回写入的字符,否则返回EOFputc()putc()与fputc()基本相同,只是putc()是用宏实现的fputc是用函数实现的。intputc(intc,FILE*stream);args:intc:要写入的字符FILE*stream:指向要写入的文件的指针return:如果没有错误,返回写入的字符,否则返回EOF我们通过例子来看看上面的使用方法函数:#includeintmain(intargc,char*argv[]){FILE*fp;fp=fopen("stdio.log","w+");if(fp==NULL){printf("文件创建失败...\n");返回-1;}else{printf("文件创建成功...\n");}/*fwrite()函数*/charbuffer_1[]="ThisisfwriteDEMO...";size_twr_size=0;wr_size=fwrite(buffer_1,1,sizeof(buffer_1),fp);printf("wr_size=%d\n",wr_size);/*fputs()函数*/charbuffer_2[]="\nThisisfputsDEMO...\n";intfputs_status=0;fputs_status=fputs(buffer_2,fp);printf("fputs_status=%d\n",wr_size);/*puts函数*/charbuffer_3[]="ThisisputsDEMO...";放(缓冲区_3);/*fputc函数*/charbuffer_4[]="ThisisfputcDEMO...\n";诠释;为了(inti=0;iintmain(intargc,char*argv[]){FILE*fp;fp=fopen("stdio.log","r+");if(fp==NULL){printf("文件打开失败...\n");返回-1;}else{printf("文件打开成功...\n");}/*fread()函数*/charbuffer_1[50];size_trd_size=0;rd_size=fread(buffer_1,1,24,fp);printf("rd_size=%d\n",rd_size);printf("freadget:%s\n",buffer_1);/*fgets()函数*/charbuffer_2[50];字符*fgets_status;fgets_status=fgets(buffer_2,23,fp);printf("fgets_status=%s",fgets_status);printf("fgetsget:%s",buffer_2);/*获取函数*/charbuffer_3[50];获取(缓冲区_3);printf("getsget:%s",buffer_3);/*fgetc函数*/intret;尽管e((ret=fgetc(fp))!=EOF)printf("%c",ret);fclose(fp);返回0;}在编译过程中,编译器会警告:warning:implicitdeclarationoffunction'gets'[-Wimplicit-function-declaration]gets(buffer_3);^~~~/tmp/cc3YWk3i.o:Infunction`main':fread_get.c:(.text+0x11d):警告:`gets'函数很危险,不应使用。因为gets()函数太危险了,C11中的中不再包含gets()函数,所以会出现这个警告:要读取的文件写在该函数生成的stdio.log文件之前,终端输出如下。文件打开成功...rd_size=24freadget:ThisisfwriteDEMO...fgets_status=ThisisfputsDEMO...fgetsget:ThisisfputsDEMO...testgetsget:testThisisfputcDEMO...ThisisputcDEMO...总结本文主要介绍如何使用几个基本的标准IO函数对文件进行操作。与文件IO相比,标准IO使用起来更加方便,并且支持跨平台使用。同时,在传输大文件时,标准IO并不比文件IO慢。本文中出现的代码可以在我的github上找到。如果您觉得本文对您有帮助,请点赞支持,谢谢!