复习:
文件操作
打开-读写-关闭
open(文件名,打开方式,文件访问权限)
打开或创建文件
open("a.txt",O_RDONLY);
O_CREAT 创建
O_EXCL 文件存在 报错
O_TRUNC
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
O_CREAT|O_WRONLY
掩码
ssize_t ret = write(fd,buf,count)
read(fd,write_buf,count1);
close(fd);
作业:
作业:实现文件的拷贝 类似功能:cp a.txt b.txt
要求:源文件名字和目标文件名从main命令行传参
#include"my.h"
int main(int argc,char*argv[])//a.out src_name des_name
{
if(argc!=3)
{
printf("%s src_name des_name\n",argv[0]);
return 0;
}
int fd_src = open(argv[1],O_RDONLY);
if(fd_src<0)
{
perror("open_src");//open_src:xxxx
return 0;
}
int fd_des = open(argv[2],O_CREAT|O_WRONLY,0666);
if(fd_des<0)
{
perror("open_des");
close(fd_src);
return 0;
}
char buf[1024];
ssize_t rd_ret,wr_ret;
while(1)
{
bzero(buf,sizeof(buf));//将buf清零
rd_ret = read(fd_src,buf,sizeof(buf));
if(rd_ret<=0)
{
close(fd_des);
close(fd_src);
break;
}
wr_ret = write(fd_des,buf,rd_ret);
if(wr_ret<0)
{
perror("write");
close(fd_des);
close(fd_src);
return 0;
}
}
close(fd_des);
close(fd_src);
return 0;
}
#include <strings.h>
void bzero(void *s, size_t n);
功能:将地址s的前n个字节清零
一、
基础知识
- 什么是IO : linux 下读写文件的方式。
- 什么是流 : 标准IO的操作对象。 (是描述文件信息的结构体)
二、标准io操作
打开文件-读写-关闭文件
1、
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
功能:打开或创建文件
参数1:同open
参数2:同open的flag 文件打开的方式
r:以只读的方式打开 文件已存在
r+:以读写方式打开 文件已存在
w:以只写方式打开 文件内容会清空 如果文件不存在 则创建 存在则打开
w+:以读写方式打开 文件内容会清空 如果文件不存在 则创建 存在则打开
a:以追加写的方式打开 如果文件不存在 则创建
a+:以读写方式追加 如果文件不存在 则创建 写入的数据会被加到文件尾后,读取时从文件起始位置
返回值:成功返回FILE*类型文件流指针 失败NULL
#include<stdio.h>
int main()
{
FILE * fp = fopen("day22.txt","w");//
if(NULL==fp)
{
perror("fopen");
return 0;
}
return 0;
}
练习:输入文件名字 判断文件是否存在
#include<stdio.h>
int main()
{
FILE *fp=NULL;
fp = fopen("./class.txt","r");
if(NULL==fp)
{
perror("fopen");
return 0;
}
else
{
puts("file exist!");
}
return 0;
}
2.按行读写
char *fgets(char *s, int size, FILE *stream);
功能:从文件中读取一行
参数1:读取数据存放的位置
参数2:最多读多大 size大小包含'\0' 所以实际读到的有效字符最多为size-1个有效字符
参数3:文件流指针
返回值:成功返回读到的数据 失败或到文件结尾返回NULL
例子:
#include<stdio.h>
#include<strings.h>
int main()
{
FILE * fp = fopen("my.h","r");//
if(NULL==fp)
{
perror("fopen");
return 0;
}
char buf[10]="\0";
fgets(buf,sizeof(buf),fp);
printf("read:%s\n",buf);
//最多读sizeof(buf)-1
bzero(buf,sizeof(buf));//清除缓存
fgets(buf,sizeof(buf),fp);
printf("read2:%s\n",buf);
//fgets读操作遇到回车结束
return 0;
}
例子:读取整个文件
#include<stdio.h>
#include<strings.h>
int main()
{
FILE * fp = fopen("my.h","r");//
if(NULL==fp)
{
perror("fopen");
return 0;
}
char buf[100]="\0";
char *pret=NULL;
while(1)
{
bzero(buf,sizeof(buf));
pret = fgets(buf,sizeof(buf),fp);
if(NULL==pret)//如果出错或者读到文件结尾
{
break;
}
printf("%s",buf);
}
return 0;
}
练习:统计文件行数
要求:文件名命令行传参
#include<stdio.h>
#include<strings.h>
#include<string.h>
int main()
{
FILE * fp = fopen(“fopen3.c”,“r”);//
if(NULL==fp)
{
perror(“fopen”);
return 0;
}
char buf[10]="\0";
char *pret=NULL;
int count=0;
while(1)
{
bzero(buf,sizeof(buf));
pret = fgets(buf,sizeof(buf),fp);
if(NULL==pret)//如果出错或者读到文件结尾
{
break;
}
if(buf[strlen(buf)-1]=='\n')
{
count++;
}
}
/**第一种情况:fgets一次
*12345678\n\0 --
第二种情况:需要fgets两次
123456789abcde\n
123456789\0 ---第一次
abcde\n\0\0\0\0 ---第二次
* **/
printf("行数:%d\n",count);
return 0;
}
- int fputs(const char *s, FILE *stream);
功能:向文件中写入一行
参数1:要写的内容
参数2:写到哪里
返回值:成功返回非负数 失败EOF(文件结束标志) 注意:#define EOF -1
#include<stdio.h>
int main()
{
FILE * fp = fopen("day22.txt","w");
if(NULL==fp)
{
perror("fopen");
return 0;
}
char buf[]="wake up!";
int ret = fputs(buf,fp);
if(EOF==ret)
{
perror("fputs");
return 0;
}
return 0;
}
练习:存在文件my.h(有内容) 读取my.h中内容 并且将读取的内容写入b.txt
#include<stdio.h>
#include<strings.h>
int main()
{
FILE *fp_r = fopen("my.h","r");
if(NULL==fp_r)
{
perror("fp_r");
return 0;
}
FILE *fp_w = fopen("b.txt","w");
if(NULL==fp_w)
{
perror("fp_w");
return 0;
}
char buf[1024]="\0";
char *pret=NULL;
int ret;
while(1)
{
bzero(buf,sizeof(buf));
pret = fgets(buf,sizeof(buf),fp_r);
if(NULL==pret)//文件结尾
{
break;
}
ret = fputs(buf,fp_w);
if(EOF==ret)
{
perror("fputs");
return 0;
}
}
}
- int fclose(FILE *fp);
功能:关闭文件fp
5.按字节读写
(1) int fputc(int c, FILE *stream);
功能:向文件中写入一个字符
返回值:成功返回写入的字符 错误返回EOF
#include<stdio.h>
int main()
{
FILE * fp = fopen("day23.txt","w");//
if(NULL==fp)
{
perror("fopen");
return 0;
}
int ret = fputc('x',fp); //将一个字符写入文件fp
if(EOF==ret)
{
perror("fputc");
fclose(fp);//关闭文件
return 0;
}
char ch='y';
fputc(ch,fp);
fclose(fp);
return 0;
}
(2)int fgetc(FILE *stream);
功能:从文件中读取一个字符
返回值:成功返回读到的字符 到文件结尾返回EOF
#include<stdio.h>
int main()
{
FILE * fp = fopen("my.h","r");//
if(NULL==fp)
{
perror("fopen");
return 0;
}
char ch = fgetc(fp);
//循环读取文件内容
while(ch!=EOF)//说明没有读到文件结尾
{
printf("%c ",ch);
ch = fgetc(fp);
}
printf("%d\n",ch);//#define EOF -1
fclose(fp);
return 0;
}
作业:fgetc fputc实现
存在文件a.txt(有内容) 读取a.txt中内容 并且将读取的内容写入b.txt cp