1.简介
标准IO是具有缓存机制的IO,缓存分为行缓存、全缓存、不带缓存
1).行缓存:缓存行空间填满或者遇到换行符才被释放,大小1k
2)全缓存:缓存IO空间填满时候才被释放,大小为4k
3)不带缓存:stderr
#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代码
、
#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");
}
stu.num = 10;
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");
}
return 0;
}
运行结果:
fopen ok
write = 1
read = 1
stu.num = 10,stu.name = xiaoming
fclose ok