基本IO系统调用(C语言)

文件描述符

非负整数

定义形式

int fd;

标准文件描述符定义
STDIN_FILENO(0)
STDOU_FILENO(1)
STDERR_FILENO(0)

文件操作的一般过程

打开-读/写/-[定位]-关闭

出错处理

UINX风格
返回值
"errno"变量(“/usr/include/errno.h”)

strerror

#include<string.h>
char *strerror(int errnum);

返回出错的字符串描述

perror()
#include<stdio.h>
void perrpr(const char *msg);
打印错误原因字符串

open()/creat()

功能

打开或创建一个文件或设备

头文件

#include<sys/types.h>

#include<sys/stat.h>

#include<fcntl.h>

函数原型

int open(const char *pathname,int flags);

int open(const char *path)

int creat (const char *pathname,mode_t mode);

返回值

成功时返回新文件描述符

否则返回-1

参数flags说明

功能

文件访问模式

取值说明(/usr/include/fcntl.h)

O_RDONLY:只读形式打开

O_WRONLY:只读形式打开

O_RDWR:读写形式打开

o_APPEND:追加模式打开

O_TRUNC:若文件存在且为只读或只写成功打开,则长度为0

O_CREAT:若文件不存在则创建
使用此选项时,需同时说明参数mode说明文件的存取许可权位

O_EXCL:若同时指定O_CREAT,而文件已经存在,则出错
该参数可测试文件是否存在,如果不存在则创建此文件

creat()函数说明
等价于已参数O_CREAT|O_WRONLY|O_TRUNC执行open()
image

read()/write()系统调用

read()

功能

从文件描述符读取数据

头文件

#include<unistd.h>

函数原型

ssize_t read(int fd,void *buf,size_t count);

返回值:读到的字节数,若已到文件尾为0,若出错为-1

write()

功能

将数据写入文件描述符

头文件

#inclde<unistd.h>

函数原型

ssize_t write(int fd,const void *buf ,size_t count)

返回值:若成功为已写的字节数,若出错为-1

close()

功能

关闭文件描述符

头文件

#include<unistd.h>

函数原型

int close(int fd)

成功:返回0

失败:返回-1

lseek()

功能

调节读写的偏移量

头文件

#include<sys/types.h>

#include<unistd.h>

函数原型

off_t lseek(int fildes,off_t offset,int whence);

返回值

成功时返回偏移量

否则返回-1

whence说明

SEEK_SET:从文件开始的偏移量

SEEK_CUR: 从当前位置开始加offset后的偏移量

SEEK_END:从文件末开始加offset后的偏移量

duo()系统调用

功能

复制文件描述符

头文件

#include<unistd.h>

函数原型

int dup(int oldfd);

传给该函数一个现有描述符,和目标描述符

目标描述符将变成源描述符的复制品。即两个文件描述符指向同一文件,且时源描述符指向的文件

返回值

成功时返回新文件描述符

否则-1

dup2()

函数原型

int dup2(int oldfd,int newfd);

fcntl()

功能

根据文件描述符来操作文件的特性

头文件

#include<unistd.h>

#include<fcntl.h>

函数原型

int fcntl(int fd,int cmd);

int fcntl(int fd, int cmd,long arg);

int fcntl(int fd,int cmd,struct flock *lock);

参数说明

fd :文件描述符

cmd :操作命令

arg :命令使用参数

lock: 命令使用的参数

返回值

若成功,则依赖于cmd

若出错 -1

cmd参数说明

F_DUPFD: 复制文件描述符
FD_CLOEXEC:设置close-on-exec标致
F_GETFD:读取文件描述符标志
F_SETFD:设置文件描述符标志
F_GETFL:读取文件状态标志
F_SETFL:设置文件状态标志
F_GETLK:获取记录锁
F_SETLK:释放记录锁
F_SETLKW:测试记录锁

## 缓存I/O

缓存文件系统为每个正在被使用的文件在内存开辟文件信息区

文件信息用FLIE结构体描述
image

Stream及"FILE"结构

FLIE *fp;

typedef struct
{
   int cnt; //余下的字符数
   char *ptr; //下一个字符的位置
   char *base; //缓冲区的地址
   int flag; //存取方式
   int  fd; //文件描述符
}FLIE; 

预定义指针

extern FLIE *stdin;
extern FLIE *stdout;
extern FLIE *stderr;

文件类型指针

指针变量说明
FLIE *fp;
用法

文件打开时,系统自动建立文件结构体

返回指向它的指针,程序通过这个指针获得文件信息,访问文件

文件关闭后,文件结构体被释放

image

fopen()函数

功能

打开文件流

头文件

#include<stdio.h>

函数原型

FILE *fopen(const char *filename.const char *mode);

mode参数说明

“r”: 以读方式打开文本文件

“w”:以写方式创建一个文件,覆盖老文件

“a”: 以追加方式打开文件

“r+”:以读方式打开一个现存文件

“w+”:以读写方式打开一个文件

   若不存在,将创建
   
   若存在,将覆盖原文件

“a+”:以读及追加方式打开文件,若不存在,将创建之

“b”:以二进制模式打开文件

“t”:以文本模式打开文件

fclose()函数

功能

关闭文件流

头文件

#include<stdio.h>

函数原型

int fclose(FILE *stream)

返回值

成功时返回0

否则-1

输入字符

头文件

#include<stdio.h>

函数原型

int fgetc(FLIE *fp)

从文件流中读取下一个字节,并作为字符返回

到达文件尾或出现错误时,放回EOF

int getc(FLIE *fp);

与fgetc()功能类似,但可实现称一个宏

int getchar(void)

相当于getc(stdin)

输出字符

头文件

#include<stdio.h>

函数原型

int fputc(int c,FILE *fp);

向输出文件流写入一个字符

int putc(int c,FILE*fp);
int putchar(int c);

相当于put(c,stdout)

返回值

成功时返回写入的字符ASC码值

否则放回-1

image

int feof(FLIE *fp)

功能

判断文件是否结束

返回值

文件结束,返回真(非0),文件为结束,返回0

while(!feof(fp))
{
    ch=fgetc(fp);
}

输入一行字符串

头文件

#include<stdio.h>

函数原型

 char *fgets(char *s,int size ,FILE* STREAM);
  /*最多读取size-1个字符,并保存在S中
  遇到EOF或者新行时读操作结束
  '\0'保存在S的末尾
  */
  char *gets(char *s);
  //类似fgest(),但从标准读入读取数据并丢遇到的换行符号

返回值

成功返回指向字符串S的指针

失败返回NULL

输出一行字符串

头文件

#include<stdio.h>

函数原型

int fputs(const char *s,FILE*stream);
int puts(const char *s);

返回值

如果写入成功,则返回非0(不是写入的字节数,仅仅是个非零值)次时编辑器默认为返回1

如果写入错误,则返回EOF

注意
puts会自动在输入的字符串末尾加入回车符

  FILE  *fp;
  char  string[81];
  if((fp=fopen("file.txt","w"))==NULL){
     printf("cann't open file");exit(0); 
  }
   while(strlen(gets(string))>0) {
       fputs(string,fp);
       fputs("\n",fp);
  }
  fclose(fp);
  if((fp=fopen("file.txt","r"))==NULL){
     printf("cann't open file");
     exit(0); 
  }
  while(fgets(string,81,fp)!=NULL)
     puts(string);
  fclose(fp);
 }

格式化I/O

头文件

#include<stdio.h>

函数原型

int fprintf(FILE *fp,const char *format,...)
int fscanf(FILE *fp,const char *format,...)

功能

按格式对文件进行I/O操作

返回值

成功,放回I/O操作

出错或文件尾,返回EOF

fprintf(fp,"%d,%6.2f",i,t)

//将i和t按%d和%6.2f格式输出到fp文件
fscanf(fp,"%d,%f",&i,&t)

//若文件中有 3,4,5,则将3送如i,4.2送入

printf("%d,%6.2f",i,t)
//将i和t按格式%d和%6.2f输出到屏幕

scanf("%d,%f",&i,&t);
//若键盘输入为3,4,5 则将3送入i,4.5送入t

取指定长度的字符串

char s[80],c[80];
int a,b;
FILE *fp;
if(fp=fopen("test","w")==NULL){
    puts("can not open file");
    exit();
}
scanf("%s%d",s,&a);
fprintf(fp,"%s %d",s,a);
fclose(fp);
if((fp=fopen("text","r"))==NULL){
    puts(
    "can't open file");
    exit();
}
fscanf(fp,"%s%d",c,&d);
printf("%s%d",c,b);
fclose(fp);
} 
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值