Linux标准I/O(一)
来源:互联网 发布:国家工商行政总局网络 编辑:程序博客网 时间:2024/04/29 11:45
#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<stdlib.h>/*************************************** #icnlude<stdio.h>** FILE *fopen(const char *pathname,const char *mode)** FILE *freopen(const char *pathname,const char *mode,FILE *fp)** FILE *fdopen(int fd,const char*mode)** 说明:pathname是包含文件路径的文件名,mode是流文件的读写方式,fd是文件描述符**** fopen打开一个指定的文件,并创建一个相连的流** freopen在一个特定的流上面打开一个特定的文件。它首先关闭fp指定的流,在打开由pathname指定的流** fdopen将一个流对应到某个一打开的文件**** 返回值:成功返回FILE 的指针,反之返回NULL** mode的取值有如下含义:r(读) w(写) a(追加)b(二进制文件)** #include<stdio.h>** int fclose(FILE *fp);** int fcloseall();** fclose关闭指定的流指针,fcloseall是关闭所有的流** 返回值:fclose成功返回0,反之返回非0 fcloseall返回关闭的流的数量,失败返回EOF*************************************/int main(int argc,char *argv[]){ FILE * fp; int ret; if(argc<=1) { printf("argc error\n"); return 1; } fp=fopen(*(argv+1),"r"); if(fp==NULL) { printf("fopen error\n"); return 2; } printf("%s is opened\n",argv[1]); ret=fclose(fp); if(ret!=0) { printf("fclose error\n"); return 3; } return 0;}
关于fclose和fcloseall的区别代码
#include<stdio.h>int main(int argc,char * argv[]){ FILE *fp1,*fp2; if((fp1=fopen("file1.txt","w"))==NULL) { printf("fopen file1 error\n"); return 1; } printf("file1 success\n"); if((fp1=fopen("file2.txt","w"))==NULL) { printf("fopen file2 error\n"); return 2; } printf("file2 success\n"); if(fcloseall()==EOF) { printf("fcloseall error\n"); return 3; } else printf("fcloseall success\n"); return 0;}
#include<stdio.h>/*********************************** I/O的3种类型:** (1)字符I/O:每次读取/写入一个字符** (2)行I/O :每次读/写一行字符** (3)块I/O :每次读/写若干个对象**** #include<stdio.h>** int fgetc(FILE *fp) 读取字符并转化为int类型存储** int getc(FILE *fp)** int getchar()%% int fputc(int c,FILE *fp) 将字符c转化为char,在写到fp中%% int putc(int c,FILE *fp)%% int putchar(int c)*********************************/int main(int argc,char *argv[]){ int word,line,chara; int c; int status; status=0; word=line=chara=0; while((c=getchar())!='0') { chara++; switch(c) { case '\n':line++;status=0;break; case ' ' :status=0;break; case '\t':status=0;break; default: if(status==0) { word++; status=1; } break; } } printf("there are %d characters,%d words,%d lines\n",chara,word,line); return 0;}
#include<stdio.h>/********************************** #include<stdio.h>** char * fgets(char *buf,int count,FILE fp)** char * gets(char *buf)&& int fputs(const char *str,FILE *fp)&& int puts(const char *str)** 说明:buf是接受输入的缓冲区,count是需要接受的字符数,str是要输出的字符串 前两个函数是输入,后两个是输出函数** 读取文件时只能读取count-1个字符,自动添加\0** 输出函数自动换行** 返回值:输入函数如果读取成功返回指向buf的指针,如果失败返回NULL********************************/int main(int argc,char *argv[]){ char iobuf[1024]; FILE *fp; if(argc<=1) { printf("argc error\n"); return 1; } if((fp=fopen(argv[1],"r"))==NULL) { printf("fopen error\n"); return 2; } while((fgets(iobuf,1024,fp))!=0) { puts(iobuf); } return 0;}
#include<stdio.h>#include<string.h>#include<stdlib.h>/**************************** size_t fread(void *ptr,size_t size,size_t count,FILE *fp)** size_t fwrite(void *ptr,size_t size,size_t count,FILE *fp)** 说明:ptr为指向若干个结构的指针,size为结构的大小,可以用sizeof求取** count是需要读取的结构的个数,fp是流的指针** fread()从fp指定的流中读取count个数据存放在ptr中,每个数据的大小是size,所以读取的总字节为size*count** fwrite()从ptr读取count个数据写入到fp指定的流中,每个数据的大小是size,所以写的从大小是size*count** 返回值:返回读取/写入的数据项数,注意不是字节数***************************/#define namesize 30struct{ char name[namesize];// 姓名 long number; //学号 short department; short scores[10]; //成绩}student;short *pscores;//保存学生成绩的数组int main(int argc,char *argv[]){ FILE * fpStudent; FILE * fpPscores; if(argc<=2) { printf("argc error\n"); return 1; } if((fpStudent=fopen(argv[1],"r"))==NULL) { printf("open file error\n"); return 2; } if((fpPscores=fopen(argv[2],"w"))==NULL) { printf("write file error\n"); return 3; } while((fread(&student,sizeof(student),1,fpStudent))==1) { pscores=student.scores; if((fwrite(&pscores,sizeof(pscores),3,fpPscores))!=3) { printf("fwrite error\n"); return 4; } } return 0;}
#include<stdio.h>#include<stdlib.h>#include<string.h>/************************************** #include<stdio.h>** long int ftell(FILE *fp)** int fseek(FILE *fp,long int offset,int whence)** void rewind(FILE *fp)** NOtes: fp是文件流指针,offset是偏移量,whence是偏移起点--从什么地方开始** whence的取值有:SEEK_SET(文件定位于文件开始+offset处) SEEK_CUR(文件定位于文件当前位置+offset处) SEEK_END(文件定位于文件末尾+offset处)** 返回值:fseek()成功返回0,反之返回非0** fseek()允许定位超出了文件当前末尾,如果在新位置写了数据,那么文件末尾便成了新位置,在新位置**和原文件末尾之间的数据用0填充** rewind()定位于指定的fp文件的开头** rewind(fp)==fseek(fp,0L,SEEK_SET)** ftell()调用成功返回fp所指向的流的当前位置,它是从文件开始的字节数,否则返回-1** PS:重点关注fseek************************************/struct record{ int uid; char login[10];};char *login[]={"user1","user2","user3","user4","user5"};//写出第i个位置上的记录void Putec(FILE *fp,int i,struct record *ps){ fseek(fp,(long int)sizeof(struct record)*i,SEEK_SET); fwrite((char *)ps,sizeof(struct record),1,fp);}int main(int argc,char *argv[]){ int i; FILE *fp; struct record rec; if(argc<=1) { printf("argc error\n"); return 1; } if((fp=fopen(argv[1],"w"))==NULL) { printf("create file error\n"); return 2; } for(i=4;i>=0;i--) { rec.uid=i; strcpy(rec.login,login[i]); Putec(fp,i,&rec); } fclose(fp); return 0;}
#include<stdlib.h>#include<stdio.h>#include<string.h>/******************************************* #include<stdio.h>** int fgetpos(FILE *fp,fpos_t *pos)** int fsetpos(FIle *fp,const fpos_t *pos)** 说明:fp是流的指针,pos是指向fpos_t的指针,fpos_t是存放指针位置的记录类型** 返回值:成功返回0,反之返回非0** 注意:这两个函数可以在非UNIX的系统中使用,而fseek和ftell只能在类UNIX中使用*****************************************/char buf[132];int main(int argc,char *argv[]){ FILE *fp; fpos_t pos; if(argc!=2) { printf("argc error\n"); return 1; } if(argv[1][0]!='a')//打开一个文件 { if((fp=fopen("tz.txt","w+"))==NULL)//打开问文件写数据 { printf("w+ error\n"); return 2; } } else//打开文件添加数据 { if((fp=fopen("tz.txt","a+"))==NULL) { printf("a+ error\n"); return 3; } } //写2行数据 fputs("1234567890",fp); fputs("abcdefghij",fp); fseek(fp,0L,SEEK_END); fgetpos(fp,&pos); printf("current pos is %ld\n",pos); fseek(fp,30,SEEK_END); fgetpos(fp,&pos); printf("fseek(fp,30,SEEK_END) current pos is %ld\n",pos); fputs("abcdefg",fp); printf("write %c%s%c\n",'\"',"abcdefg",'\"'); fgetpos(fp,&pos); printf("current pos is %ld\n",pos); fclose(fp); return 0;}
#include<stdlib.h>#include<stdio.h>#include<string.h>/********************************** 每个流对象内部都保持着两个指示器,一个是错误指示器,一个是文件结束指示器** 当文件读写出错时,错误指示器被设置,当遇见文件尾时 文件结束指示器被设置** #include<stdio.h>** int ferror(FILE *fp)** int feof(FILE *fp)** void clearerr(FILE *fp)** 说明:ferror是针对错误指示器的 feof是针对文件结束指示器的 clearerr清楚这两个标示** 返回值:ferror返回1如果错误指示器被设置,否则返回0** feof返回非0如果文件结尾指示器被设置,否则返回0********************************/int main(int argc,char *argv[]){ int i; FILE *fp; if(argc<=1) { printf("argc error\n"); return 1; } fp=fopen(argv[1],"w"); fgetc(fp); printf("%d\n",ferror(fp));//由于文件为空,所以读取失败 返回1 fputs("abcdefg",fp); fclose(fp); fp=fopen(argv[1],"r"); fseek(fp,0,SEEK_END); fgetc(fp); if(feof(fp))printf("end of file\n"); //返回非0 clearerr(fp); printf("%d %d\n",ferror(fp),feof(fp));//返回0 0 fclose(fp); return 0;}
#include<stdio.h>#include<string.h>#include<stdlib.h>/************************************ 读取或者写入数据都是以块为单位 流缓冲** 目的:降低write和read的次数,因为他们都是系统调用,占很多的时间** 流的三种类型:** (1)全缓冲 :缓冲区满了才发送或者读入数据。正常情况下,主存在磁盘上的文件是采用的全缓冲** 所采用的缓冲区由I/O标准函数对第一次进行I/O操作时用malloc分配。** (2)行缓冲 :输入或者输出遇到换行符时才执行I/O操作,一般用于终端的交互** (3)无缓冲 :不设置缓冲区,从流中读出或者写入的字符单个单个的传出或者传入文件。标准错误流通常是** 无缓冲的。** Linux中对于缓冲的默认值如下:** 标准错误流是无缓冲的,其他的流用于交互设备的是行缓冲,其他的都是全缓冲** #include<stdio.h>** int setvbuf(FILE *fp,char *buf,int mode,size_t size);** void setbuf(FILE *fp,char *buf);** void setbuffer(FILE *fp,char *buf,size_t size);** void setlinebuf(FILE *fp);** 说明:buf是自己设定的缓冲区,size是缓冲区的大小,mode是流的类型** mode的取值为_IOFBF 、_IOLBF 、_IONBF 分别表示全、行、无缓冲** 如果设定无缓冲,那么buf和size就忽略,否则根据buf和size指定缓冲区和大小** 如果buf设为NULL ,那么默认的size大小为BUFSIZE=256** 返回值:setvbuf成功返回0,否则返回非0表示出错**** setbuf是stuvbuf的特例,当buf为NULL时,setbuf(fp,NULL)==setvbuf(fp,NULL,_IONBF,BUFSIZE)** 如果buf不为NULL,那么setbuf(fp,buf)==setvbuf(fp,buf,_IOFBF,BUFSIZE);** setlinebuf 设置行缓冲** #include<stdio.h>** int fflush(FILE *fp)** 刷新缓冲区** 返回值:成功返回0,反之返回EOF** 注意:在读变写,或者写变成读的时候都要调用fflush**********************************/int get_line(char *buf,int bufsize,FILE *fp){ if(fgets(buf,bufsize,fp)==NULL) { if(feof(fp)!=0) { printf("end of file\n"); return EOF; } else { printf("fgets failed\n"); return 0; } } printf("call:fgets():%s \n",buf); return 1;}char buf[33];int main(int argc,char*argv[]){ FILE *fp; if(argc<=1) { printf("argc error\n"); return 1; } if((fp=fopen(argv[1],"w"))==NULL) { printf("create file failed\n"); return 2; } fprintf(fp,"this is the first line\n"); fprintf(fp,"this is the secend line\n"); fclose(fp); if((fp=fopen(argv[1],"r+"))==NULL) { printf("r+ file error\n"); return 3; } get_line(buf,sizeof(buf),fp); fflush(fp); fprintf(fp,"this line should be new secend line\n"); fflush(fp); get_line(buf,sizeof(buf),fp); fclose(fp); return 0;}
0 0
- Linux标准I/O(一)
- Linux标准I/O库常用函数总结(一)
- Linux标准I/O
- 标准I/O文件编程(一)
- Linux系统标准I/O(5.29)
- Linux 标准I/O函数库
- Linux 标准I/O函数库
- 标准库I/O vs linux api I/O全面比较一
- Linux编程常用的函数(十) 标准I/O
- Linux标准I/O库常用函数总结(二)
- Linux学习总结(四)——标准I/O与文件I/O
- Linux - 标准I/O库与高级I/O库
- linux学习---文件I/O和标准I/O
- Linux 标准I/O流学习
- linux c标准I/O函数
- linux c标准I/O函数
- linux下标准I/O操作
- Linux Advance--标准I/O的效率
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
- css属性扫一遍吧---------background。
- hdu 2795 Billboard
- 对hashcode()方法的理解
- WPF的Invoke()和BeginInvoke()
- Linux标准I/O(一)
- 结构之美:单链表的初始化、创建与遍历
- zjujoe的专栏都是月亮惹的祸--linux android 博客汇总
- C++
- shell下的文本对话框——dialog
- android开发之mac下更新SDK
- Sublime 2 在Ubuntu12.10 下配置C编译环境
- 自定义view的onDraw()方法不被调用
- PAT 1007. 素数对猜想