基于函数的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> 包含的东西有哪些 ...
随机推荐
- Java中包装类Test类测试出错的解决方法(JUnit5)
import org.junit.jupiter.api.Test; public class TestJunit { public static void main(String[]args) { ...
- PHP timezone_open() 函数
------------恢复内容开始------------ 实例 创建一个新的 DateTimeZone 对象,然后返回时区的名称: <?php$tz=timezone_open(" ...
- PHP xml_parser_set_option() 函数
定义和用法 xml_parser_set_option() 函数为 XML 解析设置选项.高佣联盟 www.cgewang.com 如果成功,该函数则返回 TRUE.如果失败,则返回 FALSE. 语 ...
- Skill 中的通用输出格式规范
https://www.cnblogs.com/yeungchie/ Skill中的通用输出格式规范 Common Output Format Specifications Format Specif ...
- 区块链钱包开发 - USDT - 三、实战(nodejs版本)
一.安装钱包 请参考另一篇随笔: 入口 二.获取测试usdt(TestOmni)步骤: 1.导入地址到钱包,往该地址充值测试比特币, 2.然后往 moneyqMan7uh8FqdCA2BV5yZ8qV ...
- TestFlight无法访问怎么办?TF如何链接AppStoreConnect解决教程
最近苹果商店半天下架近3万款应用的新闻闹的沸沸扬扬,很多被下架应用的运营商转将APP上架了TestFlight内测商店(TF签名上架),但是从7月31日起很多用户就开始反映TestFlight内测应用 ...
- android基本操作
1.页面跳转 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <androi ...
- 论文结果图:matplotlib和seaborn实现
在论文中,可视化结果往往很重要,毕竟文字太抽象,需要图片向审稿人直观的展现出我们的结果.我也写了俩篇论文和一篇专利的申请,其中也有一些画图的程序,因此记录,防止以后忘了.由于篇幅原因,文章就不贴代码, ...
- Go 中的动态作用域变量
这是一个 API 设计的思想实验,它从典型的 Go 单元测试惯用形式开始: func TestOpenFile(t *testing.T) { f, err := os.Open("notf ...
- dom4j解析xml时报出文件提前结束
在写javaweb小项目的时候,用dom4j解析xml报出如下错误: org.dom4j.DocumentException:Error ....... Nested exception: ...