linux 标准IO

标准IO是C语言官方提供的一套操作普通文件的IO接口:在只能操作普通文件,不能操作驱动设备文件。

标准IO的库: #include <stdio.h>
标准IO的接口: fopen ,fread,fwrite ,fclose.

标准输入设备:
stdin
标准输出设备:
stdout
标准出错:
stderr

标准IO接口是带缓存的!!

缓冲区的分类:
不缓冲:标准出错设备,系统IO。。。。
行缓冲: 标准输出设备,例如printf ‘\n’
全缓冲:一般的普通文件。。 (普通文件的缓冲区,是在操作的时候才会分配出来的)

设置缓冲区的大小:
函数名: setvbuf
用 法: int setvbuf(FILE *stream, char *buf, int type, unsigned size);
stream:需要设置的文件指针
buf : 期望缓冲区的地址;(假设为NULL时,使用的是内核缓冲区)
type : 期望缓冲区的类型:
_IOFBF(满缓冲):当缓冲区为空时,从流读入数据。或者当缓冲区满时,向流写入数 据。
_IOLBF(行缓冲):每次从流中读入一行数据或向流中写入一行数据。
_IONBF(无缓冲):直接从流中读入数据或直接向流中写入数据,而没有缓冲区。
size : 缓冲区内字节的数量。
返回值:成功返回 0
失败返回 非0

刷新缓冲区:
#include <stdio.h>
int fflush(FILE *stream);

//fopen函数的使用:
FILE *fopen(const char *path, const char *mode);
参数一:需要开的文件路径
参数二:打开的文件权限
“r” 只读
“r+” 读写
“w” 只写,文件不存在则,创建,存在则清空
“w+” 读写,文件不存在则,创建,存在则清空
“a” 只写,不存在创建,存在 追加
“a+” 读写,不存在创建,存在 追加
成功: 返回 一个文件指针
失败: 返回 NULL

//fwrite函数的使用:
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
参数一:数据的缓冲区
参数二:每一个数据的大小 (类型为char,返回值才反应写入数据的大小)
参数三:多少个这样的数据
参数四:文件流指针
返回值:成功 返回写入的数据项数
失败 小于或等于0
注意:写入的数据大小为 size * nmemb

//fread函数使用:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数一:数据的缓冲区
参数二:数据块的大小 (类型大小)
参数三:数据块的个数
参数四:文件流指针
返回值:成功 返回读取的数据项数目
失败 返回小于或等于0

//文件指针的光标偏移函数使用:
NAME
fgetpos, fseek, fsetpos, ftell, rewind - reposition a stream

SYNOPSIS
#include <stdio.h>

   int fseek(FILE *stream, long offset, int whence);  //偏移光标的位置
	   参数一:需要操作的文件指针  
	   参数二:文件的偏移量 
	   参数三:参考位置  :SEEK_SET  文件头
						   SEEK_CUR  当前位置 
						   SEEK_END  文件末尾
		返回值: 成功 0
				       失败 -1

   long ftell(FILE *stream);  //获取一个文件偏移量  
		参数一:需要获取的文件指针 
		返回值:偏移量的大小

   void rewind(FILE *stream);//把文件光标偏移到文件头部,相当于  fseek(FILE *stream,0,SEEK_SET)
   int fgetpos(FILE *stream, fpos_t *pos);  ->根据pos改变文件光标的位置   
   int fsetpos(FILE *stream, const fpos_t *pos);

判断文件是否读取完毕:
int feof(FILE *stream); //测试文件是否读完
int ferror(FILE *stream);//测试文件是否读错误
成功返回: 非0 真
失败返回: 0 假

-----------------------数据流操作-------每次只操作一个字符------------------
#include <stdio.h>
//读取一个字符
int fgetc(FILE *stream); //从一个文件指针中获取一个字符
int getc(FILE *stream);//跟fgetc是一样的,只不过该函数是一个宏
int getchar(void);//从标准输入设备中获取一个字符,等价于(fgetc(stdin))
//一般用于清空输入缓存区
while(getchar() != ‘\n’)

   //输出一个字符
   int fputc(int c, FILE *stream);//把一个字符写入到文件中
   int putc(int c, FILE *stream);//跟fputc一样,只不过该函数是一个宏
   int putchar(int c);//输出到标准输出中,等价于 (fputc(stdout))  

----------------------数据行操作-------------------------------------
---------------------每次操作一行数据’\n’-----------------------------
//获取一行数据
char *fgets(char *s, int size, FILE *stream);
参数一:数据的缓冲区
参数二:需要获取的数据大小
参数三:需要获取的文件
返回值:成功 返回字符串的首地址
失败 返回 NULL
(注意:当读取到EOF 或者是 新行时,就是自动结束读取,并在字符串后添加 ‘\0’)
(他读到的实际数据为size - 1个数据)

 //从键盘中获取一行数据到s中
 char *gets(char *s); (不推荐使用,因为,他不能够指定数据长度容易越界!!)
 fgets(char *s,int size,stdin); 
   
   //输出一行数据 
     int fputs(const char *s, FILE *stream);//输出一行数据,到stream中 (不会加\n,只加 '\0')
	 int puts(const char *s); //输出新的一行数据到 标准输出设备中  (自己加\n)

---------------------格式化IO接口------------------------------
printf:

   int printf(const char *format, ...); //输出format格式数据到标准输出设备中
	   //参数一:输出的	format格式     
	   
   int fprintf(FILE *stream, const char *format, ...); //输出format格式数据到 文件指针中stream
	   参数一:文件指针  
	   参数二:输出的 	format格式 
   int dprintf(int fd, const char *format, ...);//输出到文件描述符中
   int sprintf(char *str, const char *format, ...);//输出到str的缓冲区中(用户自定义的) ****** 做字符串拼接很好用
   int snprintf(char *str, size_t size, const char *format, ...);//指定size的长度到 buf中

scanf:

   #include <stdio.h>

   int scanf(const char *format, ...); //从标准输入设备中获取 format格式的  数据
   int fscanf(FILE *stream, const char *format, ...);
   int sscanf(const char *str, const char *format, ...);

format格式:

%d ->整形
%c ->字符
%s ->字符串
%p ->地址
%f ->浮点型 (常用)

%u ->无符号十进制整形
%o ->无符号8进制整形
%x ->无符号16进制整形
%e ->指数幂的形式 e
%.5s ->取前5个字符

#include <stdio.h>
#include <string.h>

int main()
{
	//打开需要操作的文件
	FILE *fd = fopen("1.c","r+");
	if(fd == NULL)
	{
		perror("open fail:");
		return -1;
	}

	char buf[1024]={0};
	int ret = 0;
	//循环读取一个文件
	while(1)
	{
		memset(buf, 0, sizeof(buf));
		ret = fread(buf,sizeof(char),1024,fd);
		if(ret <= 0)
		{
			if(ferror(fd)) //判断是否读取错误
			{
				printf("读取文件错误\n");
			}
			
			if(feof(fd)) //判断是否读取完
			{
				printf("文件读到末尾\n");
				break;
			}
		}
		else
		{
			printf("%d\n",ret);
		}		
	}	 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值