1. 打开文件
#include <stdio.h>
FILE *fopen(const char *path,const char *mode);
/**
* path:你要打开的文件的路径
* mode:对打开文件要进行的操作
* r :只读操作 --- 文件必须存在
* r+:读写操作 --- 文件必须存在
* w :只写操作 --- 如果文件不存在则创建;文件存在则先清空
* w+:读写操作 --- 如果文件不存在则创建;文件存在则先清空
* a :只写操作 --- 如果文件不存在则创建;文件存在则追加写
* a+:读写操作 --- 如果文件不存在则创建;文件存在则追加写
* 返回值:
* 成功:返回文件关联的流
* 失败:返回NULL
**/
2. 读文件
2.1 读一个字符
int getchar(void);//从标准输入流缓存区中读一个字符
int getc(FILE *stream);//从指定流获取一个字符
int fgetc(FILE *stream);//从指定流获取一个字符
/**
* 返回值:
* 成功:返回读到的字符
* 失败或者读到文件末尾:返回-1
实例1:自己写个程序实现cat 1.c 的功能
#include <stdio.h>
int main(int argc,char *argv[])
{
//文件输入判断
if(2 != argc)
{
printf("usage:%s <filename>\n",argv[0]);
return -1;
}
FILE *fp_r = fopen(argv[1],"r");
if(NULL = fp_r)
{
perror("fopen");
return -1;
}
char ch;
while((ch = fgetc(fp)) != -1)
{
printf("%c",ch);
}
return 0;
}
2.2 写一个字符
int putchar(int c);//向标准输出流输出一个字符
int putc(int c,FILE *stream);//向指定流写入一个字符
int fputc(int c,FILE *stream);//向指定流写入一个字符
/**
* 返回值:
* 成功:返回写入的字符
* 失败:返回-1
实例2:自己写个程序实现拷贝一个文件的功能
#include <stdio.h>
int main(int argc,char *argv[]) //./a.out 1.c 2.c
{
//文件输入判断
if(3 != argc)
{
printf("usage:%s <filename> <filename>\n",argv[0]);
return -1;
}
FILE *fp_r = fopen(argv[1],"r");//进行读操作的文件
if(NULL = fp_r)
{
perror("fopen");
return -1;
}
FILE *fp_w = fopen(argv[2],"w");//进行写操作的文件
if(NULL = fp_w)
{
perror("fopen");
return -1;
}
char ch;
while((ch = fgetc(fp)) != -1)
{
printf("%c",ch);
fputc(ch,fp_w);
fflush(fp_w);
}
return 0;
}
2.3 读一个缓存区数据 — 读到’\n’会终止
#include <stdio.h>
int gets(char *s);//向标准输入流获取一个字符串保存到缓存区
//一般不用,因为容易发生缓存区越界问题
int fgets(int s,int size,FILE *stream);//向指定流获取一个字符串保存到缓存区
//如果读到的数据大小大于size,则只读size-1个字节
//如果读到的数据小于size,则遇到'\n'就停止
//因此不会发生越界问题
/**
* 返回值:
* 成功:返回存储空间的地址
* 失败或读到文件末尾:返回NULL
2.4 写一个缓存区数据
#include <stdio.h>
int puts(const char *s);//把字符串s写到标准输出流中
int fgets(char *s,FILE *stream);//把字符串s写到指定流中
/**
* 返回值:
* 成功:返回写入的个数
* 失败或读到文件末尾:返回-1
实例3:自己写个程序实现cat 1.c功能
#include <stdio.h>
int main(int argc,char *argv[]) //./a.out 1.c
{
//文件输入判断
if(2 != argc)
{
printf("usage:%s <filename>\n",argv[0]);
return -1;
}
FILE *fp_r = fopen(argv[1],"r");//进行读操作的文件
if(NULL = fp_r)
{
perror("fopen");
return -1;
}
char ch[20];
while(fgets(ch,20,fp_r)) != NULL)
{
printf("%s",ch);
}
return 0;
}
实例4:自己写个程序实现拷贝一个文件功能
#include <stdio.h>
int main(int argc,char *argv[]) //./a.out 1.c 2.c
{
//文件输入判断
if(3 != argc)
{
printf("usage:%s <r_file> <w_file>\n",argv[0]);
return -1;
}
FILE *fp_r = fopen(argv[1],"r");//进行读操作的文件
if(NULL = fp_r)
{
perror("fopen");
return -1;
}
FILE *fp_w = fopen(argv[2],"w");//进行读操作的文件
if(NULL = fp_w)
{
perror("fopen");
return -1;
}
char ch[20];
while(fgets(ch,20,fp_r)) != NULL)
{
fputs(ch,w,fp_w);
fflush(fp_w);
}
return 0;
}
2.5 读一块数据
#include <stdio.h>
size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);
/**
* size:对象块大小
* nmemb:对象个数
* 返回值:
* 成功:返回读到的对象个数
* 失败:返回为小于对象个数或0
实例5:自己写个程序实现cat 1.c功能
#include <stdio.h>
#include <strings.h>
int main(int argc,char *argv[])//./a.out 1.c
{
if(argc != 2)
{
printf("usage:%s <filename>\n",argv[0]);
return -1;
}
FILE *fp = fopen(argv[1],"r");
if(NULL == fp)
{
perror("fopen");
return -1;
}
char buf[20];
int ret;
while(1)
{
bzero(buf,20);//良好的习惯应该是每次都重置缓存区,以免历史数据遗留
ret = fread(buf,1,sizeof(buf)-1,fp);
printf("%s",buf);
fflush(stdout);//刷新到交互式终端
if(ret < sizeof(buf)-1)
{
break;//全部读完,结束读循环
}
slepp(1);
}
return 0;
}
2.6 写一块数据
#include <stdio.h>
size_t fwrite(void *ptr,size_t size,size_t nmemb,FILE *stream);
/**
* size:对象块大小
* nmemb:对象个数
* 返回值:
* 成功:返回写入的对象个数
* 失败:返回为小于对象个数或0
实例6:自己写个程序实现拷贝文件功能
#include <stdio.h>
#include <steings.h>
int main(int argc,char *argv[])//./a.out 1.c 2.c
{
if(argc != 3)
{
printf("uasge:%s <file_r> <file_w>\n",argv[0]);
return -1;
}
FILE *fp_r = fopen(argv[1],"r");
if(fp_r == NULL)
{
perror("fopen");
return -1;
}
FILE *fp_w = fopen(argv[2],"w");
if(fp_w == NULL)
{
perror("fopen");
return -1;
}
char buf[20];
int ret;
while(1)
{
bzero(buf,20);
ret = fread(buf,1,20,fp_r);
fwrite(buf,1,ret,fp_w);
if(ret < 20)//读完且写完
{
break;
}
}
return 0;
}
2.7 关闭已打开的文件
#include <stdio.h>
int fclose(FILE *fp);
/**
* 特点:
* 1. 关闭一个流之后,便不能对这流再进行操作。
* 2. 关闭一个流,会清空缓存区。
2.8 返回值测试函数
#include <stdio.h>
int feof(FILE *stream);//测试有无到文件末尾,
//如果到文件末尾,返回非0
int ferror(FILE *stream);//测试有无错误产生,
//如果有,返回0
简例:
if(feof(fp)&&ferror(fp))//没有到达文件末尾,且没有错误发生
{
fread();
fwrite();
}
2.9 文件指针定位
#include <stdio.h>
int fseek(FILE *stream,long offset,int whence);
/**
* offset:文件指针偏移量
* > 0:从基准位置开始往后偏移offset个字节
* < 0:从基准位置开始往前偏移offset个字节
* = 0:到文件基准位置
* whence:基准位置
* SEEK_SET:0:文件起始位置
* SEEK_CUR:1:文件当前位置
* SEEK_END:2:文件末尾
* 返回值:
* 成功:返回0
* 失败:返回其他值
#include <stdio.h>
long ftell(FILE *stream);//返回stream指向的流中,文件指针的当前位置
#include <stdio.h>
void rewind(FILE *stream);