基于函数的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> 包含的东西有哪些 ...
随机推荐
- linux虚拟机正常安装完成后获取不到IP的解决办法-网卡
通常正常情况下安装完linux虚拟机,只需要使用桥接并修改配置文件/etc/sysconfig/network-scripts/ifcfg-eth0,将如下参数值改为如下: ONBOOT=yes NM ...
- PHPSTORM常用插件
Translation 最好用的翻译插件 .env files support 可以在env函数使用是提示.env文件中所有的key值的自动完成功能 PHP composer.json support ...
- URI(统一资源标识符)
URI:统一资源标识符 (Uniform Resource Identifier) 统一资源标识符是一个用于标识某一互联网资源名称的字符串. Web上可用的每种资源 -HTML文档.图像.视频片段.程 ...
- Day11_基本搜索
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 0.学习 ...
- 2019 7 8 HL 模拟赛
今天 很不爽 昨天晚上没有睡好觉 大约2点才睡着吧 反正翻来覆去睡不着 不知道为什么可能可行流 或者可行费用流并没有深刻理解 .我不会写 让我心情非常的焦躁. 大凶 顺理成章的被3位强者吊着锤(妈呀我 ...
- 问题记录,php webserver端跨子域setcookie后浏览器不存
如题. path已设置成/,domain也已指定成父级域名,数据包response中可见Set-Cookie header为期望的cookie数据,但浏览器就是不接收.存储该cookie, 浏览器端也 ...
- IdentityServer4 (4) 静默刷新(Implicit)
写在前面 1.源码(.Net Core 2.2) git地址:https://github.com/yizhaoxian/CoreIdentityServer4Demo.git 2.相关章节 2.1. ...
- axios的post请求返回状态码400
设置拦截 axios.interceptors.request.use((config) => { if (config.method === 'post') { if (!config.isF ...
- C#LeetCode刷题之#844-比较含退格的字符串(Backspace String Compare)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4030 访问. 给定 S 和 T 两个字符串,当它们分别被输入到空 ...
- C#算法设计排序篇之03-直接插入排序(附带动画演示程序)
直接插入排序(Straight Insertion Sort) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/679 访 ...