基于函数的I/O操作(头文件stdio.h)
#ifndef _FILE_DEFINED
struct _iobuf {
char *_ptr; //文件输入的下一个位置
int _cnt; //当前缓冲区的相对位置
char *_base; //指基础位置(即是文件的其始位置)
int _flag; //文件标志
int _file; //文件描述符fd
int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
int _bufsiz; //文件缓冲区大小
char *_tmpfname; //临时文件名
};
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif
#define NULL 0
#define EOF (-1)
#define BUFSIZ 1024
#define OPEN_MAX 20 /* 最多打开文件数 */
typedef struct _iobuf {
int cnt; /*未读写字节数 */
char *ptr; /*下一可读写位置 */
char *base; /* 起始位置 */
int flag; /* 存取模式 */
int fd; /*文件描述符 */
}FILE;
extern FILE _iob[OPEN_MAX]; //用数组实现文件缓冲
#define stdin (&_iob[0])
#define stdout (&_iob[1])
#define stderr (&_iob[2]) FILE _iob[OPEN_MAX]={
{ , ( char * ) , ( char * ) , _READ, }, //标准输入
{ , ( char * ) , ( char * ) , _WRITE, }, //标准输出
{ , ( char * ) , ( char * ) , _WRITE | _UNBUF, }, //标准错误
}; enum _flags {
_READ= , /* file open for reading */
_WRITE= , /* file open for writing */
_UNBUF= , /* file is unbuffered */
_EOF= , /* EOF has occurred on this file */
_ERR= /* error occurred on this file */
};
int putchar(char ch);
int putc(int ch, FILE *stream);
int getchar();
int getc(FILE *stream);
int puts(const char *p);
char *gets(char *p);
int printf(const char *format [, <参数表>]);
int scanf(const char *format [, <参数表>]);
#define putchar(c) putc((c), stdout)
#define putc(x,p) (--(p)->cnt>=0?*(p)->ptr++=(x):_flushbuf((x),p)) /*cnt是未写字符数*/
#define getchar() getc(stdin)
#define getc(p) (--(p)->cnt>=0?(unsigned char)*(p)->ptr++:_fillbuf(p)) /*cnt是未读字符数*/

#include <stdio.h>
int main(){
fprintf(stdout, “hello ");
fprintf(stderr, “world!");
return ;
};
#include <stdio.h>
int main(){
fprintf(stdout, “hello ");
fprintf(stderr, “world!\n");
return ;
};
#include <stdio.h>
int main(){
printf(stdout, “hello \n");
fprintf(stderr, “world!");
return ;
};
#include <stdio.h>
void main(){
fprintf(stdout, "from stdout\n");
fprintf(stderr, "from stderr\n”);
};
FILE *fopen(const char *filename , const char *mode); //成功后会返回非空FILE *指针,失败则返回空指针
- w:如果外部文件已经存在,则先清除内容再打开,文件指针指向头部
- a:文件指针指向尾部
- r:打开一个存在的外部文件进行读操作
- w+:如果外部文件已经存在,则先清除内容再打开进行读/写操作,文件指针指向头部
- a+:文件指针指向尾部
- r+:打开一个存在的外部文件进行读/写操作
int fputc(char c , FILE *stream);
int fgetc(FILE *stream);
int fputs(const char *string , FILE *stream);
char *fgetc(char *string , int n , FILE *stream);
int fprintf(FILE *stream , const char *format [, <参数表>]);
int fscanf(FILE *stream , const char *format [, <参数表>]);
size_t fwrite(const void *buffer , size_t size , size_t count , FILE *stream); //按字节输出数据
size_t fread(const void *buffer , size_t size , size_t count , FILE *stream);
#define feof(p) (((p) ->flag & _EOF) != 0) //判断文件结束,文件位置指针在文件末尾时继续进行读操作会使feof返回true
#define ferror(p) (((p) ->flag & _ERR) != 0)
#define fileno(p) ((p) ->fd)
long ftell(FILE *stream);
int fseek(FILE *stream , long offset , int origin); //返回0时移动成功
- SEEK_CUR:当前位置
- SEEK_END:文件末尾
- SEEK_SET:文件头
int fclose(FILE *stream);


int _fillbuf(FILE *fp){
int bufsize;
if ((fp->flag & ( _READ | _EOF | _ERR)) != _READ)
return EOF;
bufsize=(fp->flag & _UNBUF)?:BUFSIZ; //stderr没有缓冲即bufsize=1
if ((fp -> base == NULL) /* 刚开始,还没有申请缓冲 */
if (( fp -> base = (char *) malloc(bufsize)) == NULL)
return EOF; /* 缓冲没有申请到 */
fp->ptr=fp->base;
fp->cnt=read(fp->fd,fp->ptr,bufsize); /* cnt<=1024,调用系统调用封装函数进行读文件操作,一次将输入缓冲读满*/
if (--fp->cnt < ) { /* cnt<=0 */
if (fp->cnt == -) fp->flag | = _EOF;
else fp->flag | = _ERR;
fp -> cnt =;
return EOF;
} /*一次将输入缓冲读满*/
return (unsigned char)*fp->ptr++; /* 0<cnt<=1023,返回缓冲区当前字节,并ptr加1*/
}
int _flushbuf(int x, FILE *fp){
unsigned nc;
int bufsize;
if (fp < _iob || fp > _iob + OPEN_MAX)
return EOF;
if ((fp->flag & (_WRITE | _ERR)) != _WRITE)
return EOF;
bufsize=(fp->flag & _UNBUF) ? : BUFSIZ;
if (fp->base == NULL) { /* 刚开始,还没有申请缓冲 */
if ((fp->base = (char *)malloc(bufsize)) == NULL) {
fp->flag |= _ERR;
return EOF;
}
}
else { /* 已存在缓冲,且遇到换行符或缓冲已满 */
nc = fp->ptr-fp->base;
if (write(fp->fd,fp->base,nc)!=nc) {
fp->flag |= _ERR;
return EOF
}
}
fp->ptr=fp->base; /* 缓冲区已空 */
*fp->ptr++=x;
fp->cnt=bufsize-;
return x;
}
void filecopy(FILE *infp, FILE *outfp){
int c;
while ((c=getc(infp)) != EOF)
putc(c, outfp);
}
void filecopy(FILE *infp, FILE *outfp){
char c;
while (read(infp->fd,&c,) != )
write(outfp->fd,&c,);
}
基于函数的I/O操作(头文件stdio.h)的更多相关文章
- C/C++ 中的头文件 stdio.h和stdlib.h
stdio 就是指 “standard input & output" 标准输入输出 stdio.h所包含的函数: 文件访问fopenfreopenfflushfclose二进制输入 ...
- C语言中头文件<stdio.h>中的#ifndef _STDIO_H_
先了解这里的相关知识:http://www.cnblogs.com/stemon/p/4000468.html 头文件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都in ...
- C标准头文件<stdio.h>
是很多人学C语言接触的第一个头文件,顾名思义,stdio就是"标准输入输出",其中声明了一组关于输入输出的类型,宏和函数,其中就包括了打印著名的"hello,world! ...
- Visual Studio中头文件stdafx.h的作用
在较新版的Visual Studio中,新生成的C++项目文件的的头文件夹下会默认有头文件stdafx.h,而源文件夹下则默认有源文件stdafx.cpp,手动将这些文件删除后,编译时系统还会报错.下 ...
- 头文件string.h中的函数及使用方法
来源:http://blog.csdn.net/tsyj810883979/article/details/5116817 字符串拷贝1 @函数名称: strdup函数原型: char *st ...
- 头文件intrins.h
intrins.h 在C51单片机编程中,头文件INTRINS.H的函数使用起来,就会让你像在用汇编时一样简便. 内部函数 描述 _crol_ 字符循环左移 _cror_ 字符循环右移 _ir ...
- 头文件string.h,cstring与string
string.h string.h是一个C标准头文件,所有的C标准头文件都形如name.h的形式,通过#include <string.h>可以导入此头文件.之后我们就可以在程序中使用st ...
- c 头文件<ctype.h>(一)
头文件<ctype.h>中声明了一些测试字符的函数. 每个函数的参数均为int类型,参数的值必须是EOF或可用unsigned char类型表示的字符,函数返回值为int类型. 如果参数c ...
- C++中#include包含头文件带 .h 和不带 .h 的区别
C++中#include包含头文件带 .h 和不带 .h 的区别? 如 #include <iostream> 和 #include <iostream.h> 包含的东西有哪些 ...
随机推荐
- oracle SCN推进恢复数据库 简单记录
由于是在内网专用机器上操作,没有日志记录,下面做个简单记录: 前几天某供电局的的一个老数据库存储挂了,数据全部丢失,该库没有开归档,没接备份,怎么恢复? 由于存储损坏严重,从存储恢复不好搞. 好在 ...
- 第六章 文件&IO流
6.1.File类 描述:该类是文件和目录路径名的抽象表示 构造方法: 方法 描述 public File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的File ...
- JPA第二天
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"springdata"获取视频和教程资料! b站在线视 ...
- python基础day7_编码及小数据池
数字概念,字符串----小数据池 数字的范围:-5---256 字符串: 1,不能有特殊字符 2,s*20还是同一个地址,s*21之后就是另外一个地址 i1 = 6 i2 = 6 print(id(i ...
- luogu P3829 [SHOI2012]信用卡凸包 凸包 点的旋转
LINK:信用卡凸包 当 R==0的时候显然是一个点的旋转 之后再求凸包即可. 这里先说点如何旋转 如果是根据原点旋转的话 经过一个繁杂的推导可以得到一个矩阵. [cosw,-sinw] [sinw, ...
- Java中15种锁的介绍
作者:搜云库技术团队 原文:https://segmentfault.com/a/1190000017766364 1. Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观 ...
- 包管理Go module的使用
我用 Golang 的 Web 框架 Iris 写项目时,发现下载依赖老是失败原因是被墙了(可以参考上一篇 https://www.cnblogs.com/ser0632/p/11374790.htm ...
- Xcode11更改启动页设置方法
新开了个项目,发现之前的启动页怎么也调不好,后来发现配置里边少了一行,所以整理一下,我使用的xcode版本是11. 以前的时候是在这2个中间,还有一行,通过下边2项来配置,现在更改了,附上新的教程.如 ...
- Android 布局的一些控件的补充和布局的补充(今儿没课)
前面写的博客可能会有点乱: 1,是不太会排版. 2,就是我一边看书,一边听学长讲课,所以有的知识就融入进去了,我写的都是自己的意见和理解,大家取我精华,弃我糟粕哈. 今天是书上的内容,主要讲布局的,一 ...
- Python稳居编程语言榜首,看完这篇总结,你就明白为什么要学它了
最近,网上流传一组<人工智能实验教材>的图片,照片火起来的原因是教材是为幼儿园的小朋友们设计的! Python被列入小学.初高中教材已不是新鲜事,现在又成功“入侵”了幼儿园,对此有网友调侃 ...