基于函数的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> 包含的东西有哪些 ...
随机推荐
- Mysql安装使用教程
一:简介 MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理.MySQL是开放源代码的,因此任何人都可以在Genera ...
- 《数据可视化之美》高清PDF全彩版|百度网盘免费下载|Python数据可视化
<数据可视化之美>高清PDF全彩版|百度网盘免费下载|Python数据可视化 提取码:i0il 内容简介 <数据可视化之美>内容简介:可视化是数据描述的图形表示,旨在一目了然地 ...
- LQB201804第几个幸运数
我自己一开始想的差不多,但是好像想得是vector+sort.... 直接用set它不香吗? 还有就是寻找下一个数的时候,没有用upperbound,,, 我想的大概是遍历一遍(就是用for对这个函数 ...
- It还是高薪行业不?—软件测试
It还是高薪行业不?—软件测试 谁都希望拿高薪,但是并不是所有人.所有地方都能的:甚者培训出来还不能就业的大有人在,也不是所有人都适合培训后就业(年龄.学历.专业.期望就业地点.不同行业转行还是有很大 ...
- 一分钟玩转 Spring IoC!
前言 「上一篇文章」我们对 Spring 有了初步的认识,而 Spring 全家桶中几乎所有组件都是依赖于 IoC 的. 刚开始听到 IoC,会觉得特别高大上,但其实掰开了很简单. 跟着我的脚步,一文 ...
- PHP xml_set_unparsed_entity_decl_handler() 函数
定义和用法 xml_set_unparsed_entity_decl_handler() 函数规定当解析器在 XML 文档中找到无法解析的实体时被调用的函数. 如果成功,该函数则返回 TRUE.如果失 ...
- C/C++编程笔记:C语言成绩管理系统!链式结构的管理系统源码分享
最近很多同学因为学校的要求,需要完成自己的那个C语言课程设计,于是就有很多人私信或者加我私聊我,问的最多的还是<学生成绩管理系统>,其实当你项目写多了你就会发现:其实各类的管理系统都离不开 ...
- Spring Cloud Data Flow初体验,以Local模式运行
1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Spring Cloud Data Flow是什么,虽然已经出现一段时间了,但想必很多人不知道,因为在项目中很少有人用.不仅 ...
- .NET三层架构各项目之间的引用关系及如何添加引用?
1.1三层之间的引用 整个.NET框架的项目创建完成之后,在开发之前,还需要建立各个项目之间的引用关系,以便在编写C#业务逻辑代码时调用相关项目的类库. 1.1.1 引用关系规则 .NET三层架构中的 ...
- 云计算&存储测试:FIO工具入门与实战
一.关于FIO 1.1 简介 FIO是一个开源的I/O压力测试工具,主要是用来测试磁盘的IO性能,也可测试cpu,nic的IO性能.它可以支持13种不同的I/O引擎,包括:sync,mmap, lib ...