Linux - 标准I/O库与高级I/O库
输入字符
头文件
#include <stdio.h>
函数原型
int fgetc(FILE *fp);
从文件流中读取下一个字节,并作为字符返回
到达文件尾或出现错误时,返回EOF
int getc(FILE *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);
相当于putc(c, stdout)
返回值
成功时返回写入的字符
否则返回-1
头文件
#include <stdio.h>
函数原型
char *fgets(char *s, int size, FILE *stream);
最多读取size-1个字符,并保存在s中
遇到EOF或者新行时读操作结束
‘\0’保存在s的末尾
char *gets(char *s);
类似fgets(),但从标准输入读取数据并丢弃遇到的换行符号
返回值
成功返回指向字符串s的指针
失败返回NULL
头文件
#include <stdio.h>
函数原型
int fputs(const char *s, FILE *stream);
int puts(const char *s);
字符串读写操作示例
#include<stdio.h>
main(){
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
格式化I/O用法示例
#include <stdio.h>
main(){
char s[80],c[80];
int a,b;
FILE *fp;
if((fp=fopen("test","w"))==NULL) {
puts("can‘t open file");
exit() ;
}
scanf("%s%d",s,&a);
fprintf(fp,"%s %d",s,a);
fclose(fp);
if((fp=fopen("test","r"))==NULL){
puts(“can‘t open file”);
exit();
}
fscanf(fp,"%s%d",c,&b);
printf("%s %d",c,b);
fclose(fp);
}
流文件的输入/输出
功能
读/写数据块
头文件
#include <stdio.h>
函数原型
size_t fread(void * buffer, size_t size, size_t count, FILE *fp);
size fwrite(const void * buffer, size_t size, size_t count, FILE *fp);
参数说明
buffer: 指向要输入/输出数据块的首地址的指针
size: 每个要读/写的数据块的大小(字节数)
count: 要读/写的数据块的个数
fp: 要读/写的文件指针
fread与fwrite 主要用于二进制文件的输入/输出
返值
成功,返回读/写的块数
出错或文件尾,返回0
例 float f[2];
FILE *fp;
fp=fopen(“aa.dat”,“rb”);
fread(f,4,2,fp);
for(i=0;i<2;i++)
{
fread(&f[i],4,1,fp);
f[i]+=10;
}
例 struct student
{
int num;
char name[20];
char sex;
int age;
float score[3];
}stud[10];
for(i=0;i<10;i++)
fread(&stud[i],sizeof(struct student),1,fp);
流文件的输入/输出示例
void display()
{
FILE *fp;
int i;
if((fp=fopen("d:\\fengyi\\exe\\stu_dat","rb"))==NULL)
{
printf("cannot open file\n");
return;
}
for(i=0;i<SIZE;i++)
{
fread(&stud[i],sizeof(struct student_type),1,fp);
printf("%-10s %4d %4d %-15s\n",stud[i].name,
stud[i].num,stud[i].age,stud[i].addr);
}
fclose(fp);
}
#include <stdio.h>
#define SIZE 4
struct student_type
{
char name[10];
int num;
int age;
char addr[15];
}stud[SIZE];
main()
{
int i;
for(i=0;i<SIZE;i++)
scanf("%s%d%d%s",stud[i].name,&stud[i].num,
&stud[i].age,stud[i].addr);
save();
display();
}
文件定位
文件的定位
文件位置指针—–指向当前读写位置的指针
读写方式
顺序读写:每次均以上次读或写入后的下一位置作为本次读或写的起点
随机读写:位置指针按需要移动到任意位置
rewind函数
函数原型
void rewind(FILE *fp)
功能
重置文件位置指针到文件开头
返值
无
文件定位示例
#include <stdio.h>
main()
{
FILE *fp1,*fp2;
fp1=fopen("d:\\fengyi\\bkc\\ch12_4.c","r");
fp2=fopen("d:\\fengyi\\bkc\\ch12_41.c","w");
while(!feof(fp1)) putchar(getc(fp1));
rewind(fp1);
while(!feof(fp1)) putc(getc(fp1),fp2);
fclose(fp1);
fclose(fp2);
}
fseek函数
函数原型: int fseek(FILE *fp,long offset,int whence)
功能:改变文件位置指针的位置
返值:成功,返回0;失败,返回非0值
ftell函数
函数原型
long ftell(FILE *fp)
功能:返回位置指针当前位置(用相对文件开头的位移量表示)
返值:成功,返回当前位置指针位置;失败,返回-1L
main()
{
int i;
FILE *fp;
if((fp=fopen("studat","rb"))==NULL)
{ printf("can‘t open file\n");exit(0); }
scanf(“%d”, &i );
fseek(fp,i*sizeof(struct student_type),0);
fread(&stud,sizeof(struct student_type),1,fp);
printf("%s %d %d %s\n",
stud.name,stud.num,stud.age,stud.addr);
fclose(fp);
}
ferror()函数
ferror()函数
函数原型: int ferror(FILE *fp)
功能:测试文件是否出现错误
返值:未出错,0;出错,非0
说明
每次调用文件输入输出函数,均产生一个新的ferror()函数值,所以应及时测试
fopen()打开文件时,ferror()函数初值自动置为0
clearerr()函数
函数原型: void clearerr(FILE *fp)
功能:使文件错误标志置为0
返值:无
说明
出错后,错误标志一直保留,直到对同一文件调clearerr(fp)或rewind或任何其它一个输入输出函数
#include <stdio.h>
int main(void)
{
FILE *stream;
stream = fopen("DUMMY.FIL", "w");
getc(stream);
if (ferror(stream))
{
printf("Error reading from DUMMY.FIL\n");
clearerr(stream);
}
if(!ferror(stream))
printf("Error indicator cleared!");
fclose(stream);
return 0;
}
文件流缓存操作
缓存分类
块缓存
行缓存
无缓存
相关函数
头文件
#include <stdio.h>
函数原型
void setbuf(FILE *stream, char *buf);
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
_IOFBF:块缓存
_IOLBF:行缓存
_IONBF:无缓存
流与文件描述符
确定流使用的底层文件描述符
#include <stdio.h>
int fileno(FILE *fp);
根据已打开的文件描述符创建一个流
#include <stdio.h>
FILE *fdopen(int filedes, const char *mode);
临时文件
创建临时文件
头文件
#include <stdio.h>
函数原型
FILE *tmpfile(void);
返回值
成功为文件指针
出错为NULL
为临时文件创建一个文件名
头文件
#include <stdio.h>
函数原型
char *tmpnam(char *s);
返回值
指向唯一路径名的指针
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);
返回值
成功则依赖于cmd
出错返回-1
参数说明
fd:文件描述符
cmd:操作命令
arg:命令使用的参数
lock:同上
cmd参数说明
F_DUPFD:复制文件描述符
FD_CLOEXEC:设置close-on-exec标志
F_GETFD:读取文件描述符标志
F_SETFD:设置文件描述符标志
F_GETFL:读取文件状态标志
F_SETFL:设置文件状态标志
F_GETLK:获取记录锁
F_SETLK :释放记录锁
F_SETLKW:测试记录锁
mmap()函数
功能
mmap将一个文件或者其它对象映射进内存
文件被映射到多个页上
如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零
头文件
#include <sys/mman.h>
函数原型
void *mmap(void *start, size_t length, int prot, int flags, int fildes, off_t off);
返回值
成功执行时,返回被映射区的指针
失败时,mmap()返回MAP_FAILED
参数说明
start:映射区的开始地址
length:映射区的长度
prot:期望的内存保护标志,不能与文件的打开模式冲突,取值类型如下(可通过or运算合理地组合在一起)
PROT_EXEC //页内容可以被执行
PROT_READ //页内容可以被读取
PROT_WRITE //页可以被写入
PROT_NONE //页不可访问
flags:控制变化如何影响映射区
MAP_PRIVATE:映射区的写入不会影响到原文件
MAP_SHARED:映射区变化对文件有效
MAP_FIXED:使用指定的映射起始地址
msync()函数
功能
把映像的文件写回磁盘,或
重新从磁盘中读取文件
头文件
#include <sys/mman.h>
函数原型
int msync(void *addr, size_t len, int flags);
返回值
成功时,返回0
失败时,返回-1
参数说明
addr:更新映射区起始地址
len:更新映射区的长度
flags:控制更新方法
MS_ASYNC:执行异步写操作
MS_SYNC:执行同步写
MS_INVALIDATE:从文件中读回数据
munmap()函数
功能
释放内存映射区
头文件
#include <sys/mman.h>
函数原型
int munmap(void *addr, size_t len);
返回值
成功执行时,返回0
失败时,返回-1
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。