Linux -- IO编程学习之标准IO(二)

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值