系统函数I/O操作与标准库函数流操作

来源:互联网 发布:nginx sub filter 编辑:程序博客网 时间:2024/06/05 07:01

                                                                                    对于应用编程的I/O操作

      对于应用编程的io操作有两种函数操作方式,一为直接调用系统内核的API操作列open,其次为调用c标准的库函数操作列fopen。系统调用方式函数的返回值为句柄,而c库返回的是文件结构体指针。

     以下为系统调用方式对于open,lseek,write,read,的简单使用,具体的设置参数参考手册输入即可

#include <sys/types.h>#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <sys/stat.h>#include <unistd.h>#define   FILE_PATH "./test.txt"  //测试文件路径#define   FILE_PATH2 "./test2.txt" //测试文件2路径main(int argc,char *argv[]){       int f_id;       //测试文件的打开和文件的指针char w_buf[100];//写数据缓存区char r_buf[100];//读取文件数据到缓冲区int length;   //获取文件大小 if((f_id=open(FILE_PATH,O_RDWR|O_CREAT ,777))<0)//若不存在则自动创建,打开后返回的为int型指针地址,错误则为-1 {printf("第一次打开错误\n");//标志位小于0则打开失败,其他具体参数根据手册观察exit(1);//退出系统 }  else //大于0则打开成功 {    printf("第一次打开文件成功\n");   } if((read(f_id,r_buf,50*sizeof(r_buf))==-1)) {    printf("第一次读取文件失败\n"); }  else   {printf("第一次读取文件数据成功\n打印第一次读取的数据\n");  printf("%s\n",r_buf);  } if(close(f_id)>=0)  //关闭文件 {printf("第一次关闭文件成功\n");  }  else   {printf("第一次文件关闭失败\n");    }   scanf("%s",w_buf);   //数据写入缓冲区   printf("输入缓冲区数据测试:\n");   printf("%s\n",w_buf);   intf("%d\n",w_buf);//第二次打开文件后对文件的操作//文件操作if((f_id=open(FILE_PATH2,O_CREAT|O_RDWR,777))<0)  {printf("第二次打开文件失败\n");    }else{printf("第二次打开文件成功\n");}  printf("文件大小:%d\n",length=(int)lseek(f_id,0,SEEK_END));//用leesk得到文件大小  lseek(f_id,0,SEEK_END);//可以通过此函数移动文件的读写位置重而写入读出数据   if(write(f_id,w_buf,10)<0) { printf("数据写入文件失败\n"); } else { printf("数据写入文件成功\n"); }    lseek(f_id,0,0);//得到文件把文件的读写位置移动到起始位置 if(read(f_id,r_buf,length*sizeof(r_buf))<0) {    printf("第二次读取数据错误\n"); }  else   {printf("第二次读取数据成功\n"); printf("打印测试文件数据\n\b");printf("%s\n",r_buf);  } if(close(f_id)>=0)  //关闭文件 {printf("第二次关闭文件成功\n");  }  else   {printf("第二次文件关闭失败\n");    } return 0;}

c标准库函数文件流操作

对于标准库函数操作文件流,系统函数概念类似,一般都是对文本文件和二进制文件操作,具体部分共用代码测试如下:

#include <stdio.h>#include <string.h>#include <stdlib.h>#define  FILE_PATH1 "./test.txt"  //当前目录下的txt文本形式文件#define  FILE_PATH2 "./testb"      //当前目录下的二进制文件int main(int argc,char *argv[]){FILE *fp;char *p="文本文件文本流测试\n";char out[400];if((fp=(FILE *)fopen(FILE_PATH1,"a+"))==NULL)//以附加的方式代开文件,若文件不存在则创建,{ //文件打开的模式有多种,具体情况查看手册即可perror("fopen file1 failure ");exit(EXIT_FAILURE);}fflush(fp);//由于是文本流,所以须得用多加一个f,用库函数作用只是在于把缓冲区的数据读入或读取,强行挤压fwrite(p,strlen(p),1,fp);//此种写入属于不带缓冲的直接写入相关文件printf("fp->flag:%d\n ",fp->_flags);//printf遇回车换行符切换属于行缓冲fclose(fp); //用flush函数刷新输入与输出属于全缓冲,直接缓冲区全部置0//读文件件流测试if((fp=(FILE *)fopen(FILE_PATH1,"a+"))==NULL){ perror("second open error");exit(1);}printf("第二次打卡成功\n");fread(out,sizeof(out),2,fp);//除了用用fread读取也可以用gets得到,此时的文本就相当于用户界面输入一样fclose(fp);printf("fread 读取的数据:%s\n",out);//fprintf 与fscanf函数的使用和没有f时时一样的,只是输入,输出的对象不同而已,此时的文件可以想象成是屏幕printf("格式化方式输入输出文件测试开始\n");if((fp=(FILE *)fopen(FILE_PATH1,"a+"))==NULL){ perror("second open error");exit(1);}fprintf(fp,"格式化方式测试数据\n");fscanf(fp,"%s",out);//除了用用fread读取也可以用gets得到,此时的文本就相当于用户界面输入一样fclose(fp); //读取的数据多少与缓存区大小有关,如果要改变读取位置通fseek函数即可。同时还可以feof函数查看文件是否已经读到尾部printf("格式化输入输出测试数据:%s\n",out);return 0;}


      

0 0
原创粉丝点击