Linux对文件的操作有两套接口(我认为的),一类是Linux系统提供给用户的系统调用接口,另一类是c库提供的函数接口。今天要学习和总结的是c库提供的这套接口。
***********************************************************************************************
打开文件函数:
#include
FILE *fopen(const char *path, const char *mode);
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *stream);
解释:FILE *是一个文件流指针,用于指向文件。
const char *path这个是指定要打开的文件的路径
const char *mode这个是打开文件的权限。以什么方式打开文件,只读、只写、还是读写都可以。
**************************************************************************************************
关闭文件函数:
#include
int fclose(FILE *stream);
解释:FILE *stream是要关闭的文件的文件流指针
*****************************************************************************************************
错误处理函数:
#include
void perror(const char *s);
解释:const char *s这是当出现错误时,自己对这个错误的提示。
ps:如果出现错误,除了会提示自己定义的提示信息,还有系统根据出现的错误自己提示的错误。
#include
int main()
{
FILE *fd;
if((fd = fopen("1.txt","r"))==NULL)
{
perror("no file");
return -1;
}
fclose(fd);
return 0;
}
这个在测试的时候,我没有创建1.txt,提示的信息如下:
刚开始我以为系统是根据return -X中X的值而改变的。进过测试,不是。
然后我创建了1.txt,但是我让1.txt的权限改为了000,不能读写操作。运行出现以下情况:
这样我知道了,系统是根据程序运行的错误,自动给出的错误信息。
#include
char *strerror(int errnum);
解释:int errnum是错误码,自己定义一个int型的变量,然后系统会把错误的错误码自动存入这个变量中。
该函数返回的将是一个字符串,可以直接用printf("%s",strerror(errno))。打印。
******************************************************************************************************************
这两个函数是按字符读取和写入的,每次一个字符
#include
int fgetc(FILE *stream);
解释:FILE *stream是要读取的文件的文件流指针
返回值是读到的字符
#include
int fputc(int c, FILE *stream);
解释:int c是输出的字符。
*********************************************************************************************************************
按行输入输出
#include
char *fgets(char *s, int size, FILE *stream);
解释:char *s输入字符串的缓冲区的首地址。
int size输入的字符串的长度。
FILE *stream要写入的文件流指针。
#include
int fputs(const char *s, FILE *stream);
解释:const char *s输出字符串的缓冲区的首地址
FILE *stream要读入的文件流指针。
********************************************************************************************
指定大小的读写文件
#include
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
解释:void *ptr用于存放读出的字符串
size_t size是每块的大小
size_t nmemb表示有多少块
FILE *stream要读取的文件流
*********************************************************************************************************************
定位函数
#include
int fseek(FILE *stream, long offset, int whence);//
long ftell(FILE *stream);//返回文件当前的读写指针的位置
解释:
FILE *stream是要定位的文件流指针
long offset是相对于基准值的偏移量
int whence是指定基准值。
SEEK_SET 代表文件的起始位置
SEEK_END代表文件的结束位置
SEEK_CUR代表当前读写位置
**********************************************************************************************************************
实验练习1:文件的复制
#include
#define N 64
int main(int argc,char *argv[])
{
int n;
char buf[N];
FILE *fd_r;
FILE *fd_w;
if(argc != 3)
{
printf("palse shurugrshi : %s
return -1;
}
if((fd_r = fopen(argv[1],"r"))==NULL)
{
printf("open file_r err");
return -1;
}
if((fd_w = fopen(argv[2],"a"))==NULL)
{
printf("open file_w err");
return -1
}
while((n=fread(buf, 64, 1, fd_r))>0)
{
if((fwrite(buf, n, 1,fd_w))!=n)
{
printf("write err");
return -1;
}
}
if((fclose(fd_r))!=0)
{
printf("close file_read err");
return -1;
}
if((fclose(fd_w))!=0)
{
printf("close file_write err");
return -1;
}
return 0;
}
总结一下:在写打开函数的时候,出现了段错误,在找到错误后,发现自己犯了一个很低级的错误
#include
int main(int argc,char *argv[])
{
printf("%d\n",argv[1]);
return 0;
}
打印出来的是一个地址,说明在使用fopen的时候我在参数的地方给argv[1]加了双引号。。。。。。。。。。。。。。
**********************************************************************************************************************************
实验练习2:循环记录系统时间
获取系统时间函数:
#include
time_t time(time_t *tloc);
转化为本地址时间函数:
#include
char *ctime(const time_t *timep);
#include
#include
#include
int main(int argc,char *argv[])
{
FILE *fd;
time_t t;
if((fopen(argv[1], "w"))==NULL)
{
printf("open file err");
return -1;
}
while(1)
{
time(&t);
fprintf(fd,"%s\n",ctime(&t));
sleep(1);
printf("%s\n",ctime(&t));
}
fclose(fd);
return 0;
}