标准IO操作

1.简介

	标准IO是具有缓存机制的IO,缓存分为行缓存、全缓存、不带缓存
		1).行缓存:缓存行空间填满或者遇到换行符才被释放,大小1k
		2)全缓存:缓存IO空间填满时候才被释放,大小为4k
		3)不带缓存:stderr
/*************************************************************************
# File Name: 2.c
# Author: 冷瑾瑜
# mail: [email protected]
# Created Time: 2020年11月13日 星期五 14时26分38秒
 ************************************************************************/

#include<stdio.h>
#include"string.h"
int main(int argv,char *argc[])
{
    
    
	fprintf(stdout,"lengjinyu");
	fprintf(stderr,"nihao");
	
	return 0;

}
root@gongyu-virtual-machine:~/test1/713/app# ./2.out
nihaolengjinyuroot@gongyu-virtual-machine:~/test1/713/app# man 3 fgetc

上述输出显示:nihaolengjinyu,这是因为stderr是不带缓存,而stdout是行缓存,必须写满或者文件关闭或者程序执行结束才能被释放

	区别:
			文件IO			标准IO(高级IO)
			open			fopen
			close			fclose
			lseek			fseek
			read			fread(字符块)、fgets(字符串)、fgetc(单个字符)
			write			fwrite(字符块)、fputs(字符串)、fputc(单个字符)

2.相关API

	1) File* fopen(const char *pathname,const char *mode)
		pathname:文件路径
		mode:
		r:只读		r+:读写    (该文件必须存在)
		w:只写 	w+:读写	(覆盖读写,如果文件不存在则创建)
		a:只写  	a+:读写    (追加读写,如果文件不存在则创建)
		返回值:FILE*文件流指针
		
	2)int fclose(FILE*stream)
		返回值:成功关闭:0    失败:EOF(-1)
		
	3)size_t fseek(File *stream,long offset,int fromwhere)
		File *stream:文件流指针
		long offset:相对位置几个字节
		int fromwhere:
					SEEK_SET:0 文件开头位置
					SEEK_CUR:1 文件当前位置
					SEEK_END:2 文件结尾位置 
					
	4)int fgetc(FILE *stream);
		返回值:成功返回读取的字符,读到结尾则返回EOF
		
	5)int fputc(int c,FILE *stream)
		返回值:成功返回读取的字符,读到结尾则返回EOF
		
	6)char fgets(char *s,int size,FILE *stream)
		char *s:得到的字符串保存首地址
		int size:读取长度,注意-1,因为字符串结束标志\0
		File *stream:文件流指针
		返回值:成功返回字符串,失败返回NULL
		
	7)int fputs(const char *s,FILE *stream)
		const char *s:要写入的字符串
		File *stream:文件流指针
		返回值:成功返回写入字符串个数,失败返回EOF
		
	8)size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
		void *ptr,:用户空间首地址
		size_t size:块   2  4
		size_t nmemb:1块元素大小   4  2    2*4 = 4*2
		File *stream:文件流指针
		返回值:成功返回1
		
	9)size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
		void *ptr,:用户空间首地址
		size_t size:块
		size_t nmemb:1块元素大小
		File *stream:文件流指针
		返回值:成功返回1

3代码

/*************************************************************************
# File Name: 1.c
# Author: 冷瑾瑜
# mail: [email protected]
# Created Time: 2020年11月12日 星期四 09时37分12秒
 ************************************************************************/

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


typedef struct
{
    
    
	int num;
	char name[10];

}STU;

int main(int argv,char *argc[])
{
    
    
	FILE *str = fopen(argc[1],"w+");
	int ch;
	char ch1;
	int flag;
	STU stu;
	char str1[10] = "nihao";
	if(str == NULL)
	{
    
    
		perror("fopen error");
	}
	else
	{
    
    
		printf("fopen ok\n");
	}
/*	while((ch = fgetc(str)) != EOF)
	{
		printf("%c\n",ch);
	}
	ch = 'a';
	if(fputc(ch,str)!= EOF)
	{
		printf("ch写入成功");
	}
	if(fputs(str1,str)!= EOF)
	{
		printf("str1写入成功");
	
	memset(str1,0,sizeof(str1));
	int num = fseek(str,-5,SEEK_END);*/
//	while((ch1 = fgets(str1,sizeof(str1),str)) != NULL)
/*	if(ch1 = fgets(str1,sizeof(str1),str)!= NULL)
	{
		printf("%s\n",str1);
	}*/
	stu.num = 10;
	//stu.name = "xiaoming";
	strcpy(stu.name,"xiaoming");
	size_t number = fwrite(&stu,sizeof(STU),1,str);
	printf("write = %zx\n",number);
	fseek(str,-sizeof(STU),SEEK_END);
	bzero(&stu,sizeof(stu));
	size_t number1 = fread(&stu,sizeof(STU),1,str);
	printf("read = %zx\n",number1);
	printf("stu.num = %d,stu.name = %s\n",stu.num,stu.name);

	flag = fclose(str);

	if(flag == -1)
	{
    
    
		perror("fclose error");
	}
	if(flag == 0)
	{
    
    
		printf("fclose ok\n");
	}
	
//	printf("printf ok");
//	while(1);

	 return 0;

}


运行结果:
		fopen ok
		write = 1
		read = 1
		stu.num = 10,stu.name = xiaoming
		fclose ok

猜你喜欢

转载自blog.csdn.net/qq_45604814/article/details/109680960