文件编程——基本API
文件编程相关API博文推荐
以下的API为必须掌握的基本API,还有其他函数需要用到时再查即可。
基于文件流指针的C库函数文件编程
#include <stdio.h>
//函数原型:
FILE *fp;// *stream
char buf[1000];//用该内存暂存数据,做缓冲区 *ptr
FILE *fopen(const char *pathname, const char *mode);//打开某路径(缺省为当前路径)文件,打开模式
int fseek(FILE *stream, long offset, int whence);//移动文指针指向内容的光标,偏移值,绝对坐标
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);//读到缓存区buf,读多少,读几次,从文件指针指向的文件中读取
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);//把buf中的数据,写多少,写几次,写到文件指针指向的文件
int fclose(FILE *stream); //关闭文件指针指向的文件,这一步不能忽略,不然再文件编程中可能会损坏文件
文件打开模式mode:
-------------------只读----------只写--------追加--------可读可写--------可读写创建--------可读写追加
---------文本:—r---------------w------------a-------------r+ ----------------w+ ------------------a+ ----------
二进制文件:—rb-------------wb----------ab------------rb+ --------------wb+ -----------------ab+ --------
whence:
SEEK_SET文件首------SEEK_END文件尾------SEEK_CUR当前位置
基于文件描述符的系统调用文件编程
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int fd;//定义文件描述符 文件描述符:0.标准输入 1.标准输出 2.标准错误
char buf[100];//*buf
//函数原型:
int open(const char *pathname, int flags);//打开指定路径(路径缺省为当前路径)的指定文件,打开的权限(如果要创建,会有第三个创建文件权限的参数)
off_t lseek(int fd, off_t offset, int whence);//移动文件描述符指定文件内容的光标,偏移值,绝对路径,和上面的标准库fseek的whence参数一样,该函数还有个功能。通过返回文件光标从首移到尾的值获取文件大小
ssize_t read(int fd, void *buf, size_t count);//从文件读,读到buf缓存区,读多少
ssize_t write(int fd, const void *buf, size_t count);//数据写入文件,把buf中的数据写到文件,写多少
int close(int fd);//关闭文件描述符 指定的文件,文件编程中不要省略这一步,可能损坏文件。
(权限)flags:
O_RDONLY —只读 O_WRONLY—只写 O_RDWR—可读可写
O_CREAT—文件不存在则创建,需要指定创建文件权限。如0600.
O_EXCL—若同时指定O_CREAT.文件存在则出错。
O_APPEND—每次写入内容都加到文件末尾。
O_TRUNC—打开的文件,若有内容则清空。
*补充:int creat(const char filename,mode_t mode);创建文件。
mode:
S_IRUSR — 4 — 0600 可读
S_IWUSR — 2 — 可写
S_IXUSR — 1 — 可执行
S_IRWXU — 7 — 可读可写可执行
其他API
(1)fputc
int fputc(int c, FILE *stream);
c: 整形数、字符、字符串
stream: 目标文件,将c写入到目标文件
(2)fgetc
int fgetc(FILE *stream);
作用:将文件中的字符一个个读到返回的c中,然后再printf输出
(3)feof
int feof(FILE *stream);
作用:测试是否到达文件的尾巴,
若没有则返回0,
若到达则返回非0。
文件编程小demo,应用编程
标准输入再输出
#include <unistd.h>
int main(void)
{
char buf[100]={0};
read(0,buf,sizeof(buf));//从标准输入读数据
write(1,buf,sizeof(buf));//把数据输出到标准输出
return 0;
}
基于标准库实现类似于Linux下cat命令的功能
#include <stdio.h>
int main(int argc,char *argv[])//main函数的原型
{
if(argc!=2){
printf("your input is error!!!\n"); //判断命令行输入的参数
return -1;
}
FILE *fp=NULL; //定义文件流指针
char readbuf[1000]={0}; //定义数据暂存空间
fp=fopen(argv[1],"r"); //以只读方式打开文件
if(fp==NULL)
{
printf("haven't this file!!!\n");
return -1;
}else{
fread(readbuf,1,sizeof(readbuf),fp); //从指定文件中断读取数据
fwrite(readbuf,1,sizeof(readbuf),stdout); //把数据输出到标准输出(屏幕)
}
fclose(fp); //关闭文件流
return 0;
}
基于系统调用实现CP指令
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
if(argc!=3)
{
printf("命令行输入的参数不正确!!!\n"); //判断命令行中输入的参数是否是三个./a.out file.txt newfile.txt
return -1;
}
char *buf; //定义一个指针,根据后面光标读取到是文件大小再配合malloc开辟合适的暂存数据内存空间
int fd0; //定义两个文件描述符
int fd1;
unsigned int file_len=0; //存储文件大小
fd0=open(argv[1],O_RDONLY); //只读打开
if(fd0<0)
{
printf("打开文件失败或没有该文件!!!\n");
return -1;
}else{
fd1=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0600);//有此文件就覆盖,没有则创建
if(fd1<0)
{
printf("创建%s失败!!!\n",argv[2]);
close(fd0);
return -1;
}else{
file_len=lseek(fd0,0,SEEK_END); //利用光标移动计算文件大小
printf("从%s中读取到%d的数据\n",argv[1],file_len);
buf=(char*)malloc(sizeof(char)*file_len); //开辟合适的内存空间
lseek(fd0,0,SEEK_SET); //还原光标
read(fd0,buf,file_len);
write(fd1,buf,file_len);
close(fd0); //关闭两个文件描述符
close(fd1);
free(buf); //释放申请的内存空间
}
}
return 0;
}
修改config配置文件
假设有一个test.config文件的内容如下
/*
test.config 执行./a.out test.config (要修改的字段,如SPEED=)
SPEED=3
LENG=99
SCORC=9
LEVEL=7
*/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
char *readbuf=NULL;
char *mb=NULL;
if(argc!=3)
{
printf("your input is error!\n");
exit(-1);
}
int fd0;
fd0=open(argv[1],O_RDWR);
if(fd0<0)
{
printf("Haven't the file!\n");
exit(-1);
}
int len=lseek(fd0,0,SEEK_END);
readbuf=(char*)malloc(sizeof(char)*len+8);
lseek(fd0,0,SEEK_SET);
int r_len=read(fd0,readbuf,len);
char *p=(char*)malloc(strlen(argv[2])+8);
mb=p;
char p1;
printf("data:");
scanf("%c",&p1); //输入修改的新值
p=strstr(readbuf,argv[2]);
if(p==NULL)
{
printf("No found %s!\n",argv[2]);
}
p+=strlen(argv[2]);
*p=p1;
lseek(fd0,0,SEEK_SET);
int w_len=write(fd0,readbuf,strlen(readbuf));
if(w_len>0)
{
printf("Write success!\n");
}
close(fd0);
free(readbuf);
free(mb);
return 0;
}