typedef struct _iobuf{
int cnt; //缓冲区剩余字节数
char *base; //缓冲区地址
char *ptr; //缓冲区下一个字符地址
int fd; //文件描述符
int flag; //访问模式
} FILE; //别名,与标准库一致
enum _flags {
_READ = 1,
_WRITE = 2,
_UNBUF = 4, //不进行缓冲
_EOF = 8,
_ERR = 16
};
FILE _iob[OPEN_MAX] = {
{0,NULL,NULL,_READ,0},
{0,NULL,NULL,_WRITE,1},
{0,NULL,NULL,_WRITE|_UNBUF,2}
};
//判断文件流中是否有错误发生
int _ferror(FILE *f){
return f-> flag & _ERR;
}
//判断文件流是否到达文件尾
int _feof(FILE *f){
return f-> flag & _EOF;
}
//返回文件句柄,即open函数的返回值
int _fileno(FILE *f){
return f->fd;
}
FILE *_fopen(char *file,char *mode){
int fd;
FILE *fp;
if(*mode != 'r' && *mode != 'w' && *mode != 'a') {
return NULL;
}
for(fp = _iob; fp < _iob + OPEN_MAX; fp++) { //寻找一个空闲位置
if (fp->flag == 0){
break;
}
}
if(fp >= _iob + OPEN_MAX){
return NULL;
}
if(*mode == 'w'){
fd = creat(file,PERMS);
}else if(*mode == 'r'){
fd = open(file,O_RDONLY,0);
}else{ //a模式
if((fd = open(file,O_WRONLY,0)) == -1){
fd = creat(file,PERMS);
}
lseek(fd,0L,2); //文件指针指向末尾
}
if(fd == -1){
return NULL;
}
fp->fd = fd;
fp->cnt = 0; //fopen不分配缓存空间
fp->base = NULL;
fp->ptr = NULL;
fp->flag = *mode == 'r' ? _READ : _WRITE;
return fp;
}
int _getc(FILE *f){
return --f->cnt >= 0 ? *f->ptr++ : _fillbuf(f);
}
int a[10] = {1,2,3,4,5,6,7,8,9,10};
for(int *x = a;x < a + 10; x++){
printf("%d\n",*x);
}
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int *x;
for(x = a;x < a + 10; x++){
printf("%d\n",*x);
}
*x = 11; //越界进行值访问
int _fillbuf(FILE *f){
int bufsize;
if((f->flag & (_READ | _EOF | _ERR)) != _READ){ //判断文件是否可读
return EOF;
}
bufsize = f->flag & _UNBUF ? 1 : BUFSIZ;
if(f->base == NULL){ //没有分配过缓冲区
if((f->base = (char *)malloc(bufsize)) == NULL){
return EOF;
}
}
f->ptr = f->base;
int n = read(f->fd,f->ptr,BUFSIZ); //系统调用read
if(n == 0){ //到达文件结尾
f->base = NULL;
f->cnt = 0;
f-> flag |= _EOF;
return EOF;
}else if(n == -1){ //出错
f->cnt= 0;
f->flag |= _ERR;
return EOF;
}else{
f->cnt = --n;
return *f->ptr++;
}
}
The character read is returned as an int value. If the End-of-File is reached or a reading error happens, the function returns EOF and the corresponding error or eof indicator is set. You can use either ferror or feof to determine whether an error happened or the End-Of-File was reached.
int _putc(int x,FILE *f){
return --f->cnt >= 0 ? *f->ptr++ = x : _flushbuf(x,f);
}
int _flushbuf(int x,FILE *f){
if((f->flag & (_WRITE | _EOF | _ERR)) != _WRITE){ //判断文件是否可写
return EOF;
}
int n;
int bufsize = f->flag & _UNBUF ? 1 : BUFSIZ;
if(f->base != NULL){
n = write(f->fd,f->base,f->ptr - f->base); //判断需要写入多少字节
if(n != f->ptr - f->base){
f->flag |= _ERR;
return EOF;
}
}else{
if((f->base = (char *)malloc(bufsize)) == NULL){
f->flag |= _ERR;
return EOF;
}
}
if(x != EOF){
f->cnt = bufsize - 1;
f->ptr = f->base;
*f->ptr++ = x;
}else{ //当写入EOF时,代表强制刷新缓冲区内容到文件中
f->cnt = bufsize;
f->ptr = f->base;
}
return x;
}
n = write(f->fd,f->base,f->ptr - f->base); //判断需要写入多少字节
if(x != EOF){
f->cnt = bufsize - 1;
f->ptr = f->base;
*f->ptr++ = x;
}else{ //当写入EOF时,代表强制刷新缓冲区内容到文件中
f->cnt = bufsize;
f->ptr = f->base;
}
int _fflush(FILE *f){
int res = 0;
if(f == NULL){
for(int i = 0; i < OPEN_MAX; i++){ //当参数为NULL时,刷新所有的文件流
if((f->flag & _WRITE) && (_fflush(&_iob[i]) == -1)){ //有一个出错即返回-1
res = EOF;
}
}
}else{
if(f->flag & _WRITE){
_flushbuf(EOF,f);
}else{
res = EOF;
}
}
if(f->flag & _ERR){ //出错
res = EOF;
}
return res;
}
If the stream was open for reading, the behavior depends on the specific implementation. In some implementations this causes the input buffer to be cleared.
int _fclose(FILE *f){
int ret;
if((ret = _fflush(f)) != EOF){
free(f->base);
f->base = NULL;
f->ptr = NULL;
f->fd = 0;
f->flag = 0;
f->cnt=0;
}
return 0;
}
int _fseek(FILE *f,long offset,int origin){
int rc;
if(f->flag & _READ) {
if(origin == 1) {
offset -= f->cnt;
}
rc = lseek(f->fd,offset,origin);
f->cnt = 0; //将缓冲区剩余字符数清0
}else if(f->flag & _WRITE) {
rc = _fflush(f); //强制刷新缓冲区
if(rc != EOF) {
rc = lseek(f->fd,offset,origin);
}
}
return rc == -1 ? EOF : 0;
}
int _fseek(FILE *f,long offset,int origin){
int rc;
if(f->flag & _READ) {
if(origin == 1) {
offset -= f->cnt;
}
rc = lseek(f->fd,offset,origin);
f->cnt = 0; //将缓冲区剩余字符数清0
}else if(f->flag & _WRITE) {
rc = _fflush(f); //强制刷新缓冲区
if(rc != EOF) {
rc = lseek(f->fd,offset,origin);
}
}
return rc == -1 ? EOF : 0;
}
a+ Open for reading and appending (writing at end of file). The file is created if it does not exist. The initial file position for reading is at the beginning of the file, but output is always appended to the end of the file.
int _getchar(){
return _getc(stdin);
}
int _putchar(int x){
return _putc(x,stdout);
}
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#define EOF -1
#define BUFSIZ 1024
#define OPEN_MAX 20 //打开的最大文件数
#define PERMS 0666
typedef struct _iobuf{
int cnt; //缓冲区剩余字节数
char *base; //缓冲区地址
char *ptr; //缓冲区下一个字符地址
int flag; //访问模式
int fd; //文件描述符
} FILE; //别名,与标准库一致
extern FILE _iob[OPEN_MAX];
//八进制
enum _flags {
_READ = 01,
_WRITE = 02,
_UNBUF = 04, //不进行缓冲
_EOF = 010,
_ERR = 020
};
FILE _iob[OPEN_MAX] = {
{0,NULL,NULL,_READ,STDIN_FILENO},
{0,NULL,NULL,_WRITE,STDOUT_FILENO},
{0,NULL,NULL,_WRITE|_UNBUF,STDERR_FILENO}
};
#define stdin (&_iob[0])
#define stdout (&_iob[1])
#define stderr (&_iob[2])
int _ferror(FILE *f){
return f-> flag & _ERR;
}
int _feof(FILE *f){
return f-> flag & _EOF;
}
int _fileno(FILE *f){
return f->fd;
}
//返回第一个字符
int _fillbuf(FILE *f){
int bufsize;
if((f->flag & (_READ | _EOF | _ERR)) != _READ){ //判断文件是否可读
return EOF;
}
bufsize = f->flag & _UNBUF ? 1 : BUFSIZ;
if(f->base == NULL){ //没有分配过缓冲区
if((f->base = (char *)malloc(bufsize)) == NULL){
return EOF;
}
}
f->ptr = f->base;
int n = read(f->fd,f->ptr,BUFSIZ); //系统调用read
if(n == 0){ //到达文件结尾
f->base = NULL;
f->cnt = 0;
f-> flag |= _EOF;
return EOF;
}else if(n == -1){ //出错
f->cnt= 0;
f->flag |= _ERR;
return EOF;
}else{
f->cnt = --n;
return *f->ptr++;
}
}
int _flushbuf(int x,FILE *f){
if((f->flag & (_WRITE | _EOF | _ERR)) != _WRITE){
return EOF;
}
int n;
int bufsize = f->flag & _UNBUF ? 1 : BUFSIZ;
if(f->base != NULL){
n = write(f->fd,f->base,f->ptr - f->base); //判断需要写入多少字节
if(n != f->ptr - f->base){
f->flag |= _ERR;
return EOF;
}
}else{
if((f->base = (char *)malloc(bufsize)) == NULL){
f->flag |= _ERR;
return EOF;
}
}
if(x != EOF){
f->cnt = bufsize - 1;
f->ptr = f->base;
*f->ptr++ = x;
}else{ //当写入EOF时,代表强制刷新缓冲区内容到文件中
f->cnt = bufsize;
f->ptr = f->base;
}
return x;
}
/**
* @brief _fflush
* @param f
* @return
*/
int _fflush(FILE *f){
int res = 0;
if(f == NULL){
for(int i = 0; i < OPEN_MAX; i++){ //当参数为NULL时,刷新所有的文件流
if((f->flag & _WRITE) && (_fflush(&_iob[i]) == -1)){ //有一个出错即返回-1
res = EOF;
}
}
}else{
if(f->flag & _WRITE){
_flushbuf(EOF,f);
}else{
res = EOF;
}
}
if(f->flag & _ERR){ //出错
res = EOF;
}
return res;
}
int _fclose(FILE *f){
int ret;
if((ret = _fflush(f)) != EOF){
free(f->base);
f->base = NULL;
f->ptr = NULL;
f->fd = 0;
f->flag = 0; //@TODO
}
return 0;
}
int _fseek(FILE *f,long offset,int origin){
int rc;
if(f->flag & _READ) {
if(origin == 1) {
offset -= f->cnt;
}
rc = lseek(f->fd,offset,origin);
f->cnt = 0; //将缓冲区剩余字符数清0
}else if(f->flag & _WRITE) {
rc = _fflush(f); //强制刷新缓冲区
if(rc != EOF) {
rc = lseek(f->fd,offset,origin);
}
}
return rc == -1 ? EOF : 0;
}
int _getc(FILE *f){
return --f->cnt >= 0 ? *f->ptr++ : _fillbuf(f);
}
int _putc(int x,FILE *f){
return --f->cnt >= 0 ? *f->ptr++ = x : _flushbuf(x,f);
}
int _getchar(){
return _getc(stdin);
}
int _putchar(int x){
return _putc(x,stdout);
}
FILE *_fopen(char *file,char *mode){
int fd;
FILE *fp;
if(*mode != 'r' && *mode != 'w' && *mode != 'a') {
return NULL;
}
for(fp = _iob; fp < _iob + OPEN_MAX; fp++) { //寻找一个空闲位置
if (fp->flag == 0){
break;
}
}
if(fp >= _iob + OPEN_MAX){
return NULL;
}
if(*mode == 'w'){
fd = creat(file,PERMS);
}else if(*mode == 'r'){
fd = open(file,O_RDONLY,0);
}else{ //a模式
if((fd = open(file,O_WRONLY,0)) == -1){
fd = creat(file,PERMS);
}
lseek(fd,0L,2); //文件指针指向末尾
}
if(fd == -1){
return NULL;
}
fp->fd = fd;
fp->cnt = 0; //fopen不分配缓存空间
fp->base = NULL;
fp->ptr = NULL;
fp->flag = *mode == 'r' ? _READ : _WRITE;
return fp;
}
int main(int argc,char *argv[]){
FILE *f = _fopen("zyc.txt","a");
/*char c;
for(int i = 0; i < 10; i++){
c = _getc(f);
}*/
/*for(int i = 0; i < 9; i++){
_putc('6',f);
}
_fseek(f,-5,1);
for(int i = 0; i < 9; i++){
_putc('8',f);
}
_fclose(f);*/
int c;
while((c = _getchar()) != '\n'){
_putchar(c);
}
_fclose(stdout);
return 0;
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有