day 2

复习:
文件操作
打开-读写-关闭
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个字节清零

一、
基础知识

  1. 什么是IO : linux 下读写文件的方式。
  2. 什么是流 : 标准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;

}

  1. 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;
		}
	}	
}

  1. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

encounter♌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值