unix环境高级编程第五章总结

y第五章讲述的是标准IO库和各种相关函数

5.2流和FILE对象

对于标准IO库,他们的操作是围绕流进行的;当一个流刚被创建时,是没有流的定向的,可以通过下面函数改变:i

#include<stdio.h>
#include<wchar.h>
int fwide(FILE* fp, int mode);


mode < 0 ,则fwide试图使指定的流是字节定向的;
mode > 0,fwide试图将使指定的流是正向的;
mode = 0 fwide不设置流的定向,返回标识该流定向的值;
#ifndef _FILE_DEFINED
struct _iobuf {
    char *_ptr; //文件输入的下一个位置
    int _cnt; //当前缓冲区的相对位置
    char *_base; //指基础位置(即是文件的起始位置) 
    int _flag; //文件标志
    int _file; //文件描述符id
    int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
    int _bufsiz; //文件缓冲区大小
    char *_tmpfname; //临时文件名
       };
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif
5.3 标准输入和标准输出和标准错误
为一个进程定义了三个文件流: stdin,stdout,stderr,而文件描述符有对应的三个:STDIN_FIENO,STDOUT_FILENO,STDERR_FILE;包含在<unistd.h>头文件中;
5.4
缓冲有三中类型:全缓冲,行缓冲,不带缓冲;每当第一次执行IO时候,标准函数使用malloc来获得缓冲区;

值得注意的是每当通过标准IIO库从一个不太缓冲的流或者行缓冲得到输入数据,那么就会刷新所有行缓冲输入流;在课后习题中也考得了这一点;

我们可以自己更该缓冲类型,用下面两个函数:
int setbuf(FILE* restrivt_fp, char* restrictbuf);

int setvbuf(FILE* restrict_fp, char* restrict_buf,int mode, size_t size);

mode : _IOFBF, _IOLBUF, _IONBF
                                                                            成功返回0,出错返回非0
强制冲洗一个流:
#include<stdio.h>
int fflush(FILE* fp);
       成功返回,失败返回非0;
若FILE是NULL,则将导致所有输出流被冲洗;

    5.5打开一个流

用三个函数打开流:

#inlcude<stdio.h>

FILE* fopen(const char* restrict_pathname, const char* restrict_type);
FILE* freopen(const char* restrict_pathname, const char* restrict_type, FILE* restrict_fp);
FILE* fdopen(int fd, const char* type);
值得注意的是:1,freopen是重定向流,将fp重定向到pathname;
2,fdopen是文件描述符与流结合;其实流是封装的文件描述符;
对于符fdopen,type有一点区别。因为文件描述符已经被打开,所以打开的时候O_TRUNC决定是否截断该文件。
fdopen不能截断任何为他为写而打开的任意文件;
当以讀寫中类型打开文件时,具有以下限制:
如果中间没有fflush,fseek,fsetpos,rewind,则在输出的后面不能直接跟输入。
如果中间没有fseek,fsetpos,rewind,或者一个输入操作没有到达文件尾端,则在输入操作之后不能跟随输出。
关闭一个文件流:
#include<stdio.h>
int fclose(FILE* fp);
5.6读和写流
有三种不同类型的非格式化I/O中选择:
1,每次一个字符的I/O.

2,每次一行的i/o.

3,直接I/o
每次一个字符的函数:
读:
#include<stdio.h>
int getc(FILE* fp);
int fgetc(FILE* fp);
int getchar(void);

getc被实现位宏,而fgetc没有被实现宏;
无论是出错还是返回值,三个函数都返回EOF,用以三个函数处理,
#include<stdio.h>
int getc(FILE* fp);
int fgetc(FILE* fp);
int getchar(void);

int ferror(FILE* fp); 出错标志
int feof(FILE* fp); 文件结束标志
出错和文件结束标志,都由FILE维护;
为真返回非0,为假返回0;
void clearerr(FILE* fp);

从流中读取文件,ungetc函数将字符压入流中(只是将字符压入缓冲区,未写到磁盘上)
int ungetc(int c, FILE *fp);

 
输出函数:
void clearerr(FILE* fp);
int putc(int c, FILE* fp);
int fputc(int c,FILE* fp);
int putchar(int c);
成功返回C,失败返回EOF;

 

5.7每次一行IO

输入一行的函数:
char* fgets(char* restrict_buf, int n, FILE *restrict_buf);
char* gets(char* buf);
fgets将换行符存入缓冲区,而gets不将换行符存入缓冲区。

若成功,则返回buf,若不成功(出错或到达文件尾端)则返回EOF.

缓冲区总是以null字节结尾。


输出一行的函数:int fputs(const char* restrict_str,FILE* restrict_fp );int puts(const char* str);函数fputs将一个以null字节终止的字符串写到指定流,尾端的终止符null不写出。并不是每次输出一行,因为换行符不一定是最后一个非NULL的字节。                                              
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值