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

                                                                                    对于应用编程的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;
}


      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值