二、库调用
C库函数得到文件操作是独立于具体的操作系统平台的
创建和打开-fopen
// 打开或创建文件
// 成功返回文件指针,否则返回NULL
FILE * fopen(const char *filename,const char *mode)
参数
- filename 打开的文件名(包含路径,缺省为当前路径)
- mode 打开模式
模式 | 含义 |
---|---|
r,rb | 只读方式打开 |
w,wb | 只写方式打开,如果文件不存在,则创建该文件 |
a,ab | 追加方式打开,如果文件不存在,则创建该文件 |
r+,r+b,rb+ | 读写方式打开 |
w+,w+b,wh+ | 读写方式打开,如果文件不存在,则创建该文件 |
a+,a+b,ab+ | 读和追加方式打开。如果文件不存在,则创建该文件 |
b用于区分二进制文件和文本文件,这一点在DOS,windows系统中是有区分的,但Linux不区分二进制文件和文本文件
+表示读+写的方式打开文件
读写-fread-fwrite
// 从stream指向的文件中读取n个字段,每个字段为size字节,并将读取的数据放入ptr所指的字符数组中
// 返回实际已读取的字节数
size_t fread(void *ptr,size_t size,size_t n,FILE *stream)
// 从缓冲区ptr所指的数组中把n个字段写到stream指向的文件中,每个字段长为size个字节
// 返回实际写入的字节数
size_t fwrite(const void *ptr,size_t size,size_t n,FILE *stream)
读写字符-fgetc-fputc
// 从指定的文件中读一个字符
int fgetc(FILE *stream);
// 向指定的文件中写入一个字符
int fputc(int c,FILE *stream);
案例
// 读文件
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(int argc,char *argv[])
{
FILE *fd;
if((fd=fopen(argv[1],"r"))==NULL)
{
printf("\ncannot open file strike any key exit!\n");
exit(1);
}
char ch;
ch=fgetc(fd);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fd);
}
fclose(fd);
return 0;
}
// 写文件
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
FILE *fd;
char ch;
if((fd=fopen(argv[1],"wt+"))==NULL)
{
printf("\ncannot open file\n");
exit(1);
}
printf("pls input a string\n");
ch=getchar();
while(ch!='\n')
{
fputc(ch,fd);
ch=getchar();
}
fputc('\n',fd);
printf("\n");
fclose(fd);
return 0;
}
格式化读写-fscanf-fprintf
// 从一个流中进行格式化输入
fscanf(FILE *stream,char *format[,argument...]);
// 格式化输出到一个流中
int fprintf(FILE *stream,char *format[,argument]);
案例
// 格式读
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
int i=0;
printf("pls input an integer\n");
if(fscanf(stdin,"%d",&i))
{
printf("The integer read was:%d\n",i);
}
return 0;
}
// 格式写
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
FILE *fd;
int i = 10;
double j = 1.5;
const char * str = "fan lihao";
char ch = '\n';
fd = fopen(argv[1],"w+");
fprintf(fd,"%-5d%-5lf%c",i,j,ch);
fprintf(fd,"%-5s%c",str,ch);
fclose(fd);
return 0;
}
定位-fseek
int fseek(FILE *stream,long offset,int whence);
参数
- whence
- SEEK_SET 文件开始
- SEEK_CUR 当前位置
- SEEK_END 文件结束
路径获取-getcwd
// 提供一个size大小的buffer,getcwd会把当前的路径名copy到buffer中。如果buffer太小,函数返回-1
char * getcwd(char *buffer,size_t size);
在编写程序的时候,需要得到当前路径。C库函数提供了getcwd来解决这个问题
案例
#include<stdio.h>
#include<unistd.h>
#define BUFFER_SIZE 80
int main(int argc,char **argv)
{
char pwd_path[BUFFER_SIZE];
printf("current path is %s\n",getcwd(pwd_path,BUFFER_SIZE));
return 0;
}
创建目录
#include<sys/stat.h>
// 创建一个新目录
// 成功返回0,否则返回-1
int mkdir(char *dir,int mode)