一、有哪些带缓存的API函数
1. fopen
函数的作用: 打开文件
函数的原型: FILE *fopen(const char *pth, const char *mode)
mode:
r:读,文件必须存在;
r+:打开可读写,文件必须存在;
w:打开只写文件,文件不存在就会创建文件; 文件清0;
w+:打开可读写的文件,
a:附加的形式打开只写文件,不存在就创建,存在就写到原来的文件尾。
a+:以附加的形式打开可读写的文件,不存在就创建,存在就写到原来的文件尾。
b:二进制文件
文件头: #include <stdio.h>
返回值: 成功是指向=文件流的指针;
出错返回NULL;
2.fputc
函数的作用: 将一个指定的字符写入到文件流中;
函数的原型: int fputc(int c, FILE *stream);
返回值: 返回写入成功的字符,c; EOF则表示失败。
3.fgetc
函数的作用:从文件流中读取一个字符
函数原型: int fgetc(FILE *stream)
返回值:返回值正常的是读取的字符;EOF表示到了文件尾;
4.fputs
函数的作用:将一个字符串写入到文件内
函数的原型: int fputs(const char *s, FILE *stream)
返回值:成功返回写成字符数; EOF表示出错
5. fgets
函数的作用:从文件中读取一个字符串;
函数的原型: char *fgets(char *s, int size, FILE *steam)
函数的参数:
从stream中读size-1个字符到s中
返回值: 成功返回s, 出错NULL。
6. fread
函数的作用:从文件流中读取数据块
函数原型: size_t fread(void *ptr, size_t size, size_t nmemb, FILE * stream);
返回值: 返回实际读到数据块的数目
比nmember小的话,可能是到了文件尾,或者错误发生。
feof :到文件尾;
ferror:判断错误的
7.fwrite
函数的作用: 将数据块写到文件流中:
函数原型: size_t fwrite(const void * ptr, size_t size, size_t nmemb, FILE *stream);
返回值: 实际写入的nmemb数目;
8.fseek
函数的作用:移动文件流的读写位置
函数的原型: int fseek(FILE * stream, long offset, int whence)
返回值:成功返回0, 出错-1;
9 ftell
函数的作用:读取文件流的读写位置;
函数的原型:long ftell(FILE * stream)
返回值: 成功返回当前的读写位置;
出错-1;
10. feof
函数的作用: 检测文件流是否到了文件尾
函数的原型:int feof(FILE *steam)
返回值: 非零代表到了文件尾,其他是0;
11. fprintf
函数的作用:格式化数据到文件
函数的原型: int fprintf(FILE *stream, const char *format, ....);
返回值:成功返回实际输入的字符数,失败-1;
12. fscanf
函数的作用: 格式化字符串输入
函数的原型: int fscanf(FILE *strem, const char *fromat,....)
返回值:成功返回参数数目,出错-1
二、如何使用API函数
1.分析各个函数在实例中的应用
①读写文件的实例
#include <stdio.h>
#define LENGTH 100
main()
{
FILE *fd;
char str[LENGTH];
fd = fopen("hello.txt", "w+"); /* 创建并打开文件 */
if (fd)
{
fputs("Hello, Software Weekly", fd); /* 写入Hello, software weekly字符串 */
fclose(fd);
}
fd = fopen("hello.txt", "r");
fgets(str, LENGTH, fd); /* 读取文件内容 */
printf("%s\n", str);
fclose(fd);
}
2.如何使用带缓冲的IO操作进行文件复制
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#define BUFFER_SIZE 1024
int main(int argc,char *argv[])
{
int from_fd,to_fd;
int bytes_read, bytes_write;
char buffer[BUFFER_SIZE];
char *ptr;
if(argc!=3)
{
fprintf(stderr,"Usage:%s fromfile tofile/n/a",argv[0]);
exit(1);
}
if((from_fd=open(argv[1],O_RDONLY))==-1)
{
fprintf(stderr,"Open %s Error:%s/n",argv[1], strerror(errno));
exit(1);
}
if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
{
fprintf(stderr,"Open %s Error:%s/n",argv[2],strerror(errno));
exit(1);
}
while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
{
if((bytes_read==-1)&&(errno!=EINTR)) /* 一个致命的错误发生了 */
break;
else if(bytes_read>0)
{
ptr=buffer;
while(bytes_write=write(to_fd,ptr,bytes_read))
{
if((bytes_write==-1)&&(errno!=EINTR)) /* 一个致命错误发生了 */
break;
else if(bytes_write==bytes_read) /* 写完了所有读的字节 */
break;
/* 只写了一部分,继续写 */
else if(bytes_write>0)
{
ptr+=bytes_write;
bytes_read-=bytes_write;
}
}
/* 写的时候发生的致命错误 */
if(bytes_write==-1)
break;
}
}
close(from_fd);
close(to_fd);
exit(0);
}
3.比较两种文件操作,如何判断是否到了文件尾?
不带缓冲的:使用lseek
带缓冲的:使用fread函数,如果返回的是0的话,就表示文件流到了文件尾