标准IO库、系统数据文件和信息 - UNIX环境高级编程-第5、6章

第5章 标准IO库

5.2 设置FILE和对象

fwide函数:

int fwide(FILE *fp, int mode);	//返回值:若流是宽定向的返回正值,若流是字节定向的返回负值,流是为定向的返回0
5.4 缓冲

        (1) 全缓冲 (在一个流上执行第一次IO操作,相关标准IO函数通常调用malloc获得使用的缓冲区)

        (2) 行缓冲

        (3) 不带缓冲 (标准出错流stderr通常是不带缓冲的)

对任何一个给定流,不喜欢系统默认的情况,可以更改缓冲类型

void setbuf(FILE *restrict fp, char *restrict buf);
int setvbuf(FILE *restrict fp, char *restrict buf, int mode, seze_t size);	//返回值:成功返回0,出错返回非0值

        setbuf函数可以打开或者关闭缓冲机制,为了带缓冲进行IO,参数buf必须执行一个长度为BUFSIZ的缓冲区(该常量定义在stdio.h中),关闭缓冲时可以把buf设置为NULL

        使用setvbuf可以精确指定所需的缓冲类型,由mode决定:

        _IOFBF 全缓冲          _IOLBF 行缓冲            _IONBD 不带缓冲

5.5 打开流

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 filedes, const char *type);	//三个函数返回值:成功返回文件指针,出错返回NULL

        使用b作为type的一部分,可以使标准IO库区分文本文件和二进制文件。

5.6 读和写流

int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void);	//三个函数返回值:成功返回下一个字符,到达文件尾或出错返回EOF

        fgetc()是函数,getc()是宏定义,fgetc()从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。此函数被ISO C声明为一个宏,所以在用时不能

将其做为函数指针

5.9 二进制IO

size_t fread(void *restrict ptr, size_t size, sezr_t nobj, FILE *restrict fp);
size_t fwrite(const void *restrict ptr, size_t size, sezr_t nobj, FILE *restrict fp);	//返回值:读或写的对象数

        使用二进制IO只能在一个系统上读已写的数据

5.10 定位流

long ftell(FILE *fp);				//成功返回文件位置指示,出错返回-1
int fseek(FILE *fp, long offset, int whence);		//成功返回0,出错返回非0值

        whence的值:SEEK_SET, SEEK_CUR, SEEK_END

5.11 格式化IO

格式化的输出函数

int printf(const char *restrict format, ...);
int fprintf(FILE *restrict fp, const char *restrict format, ...);	//两个函数返回值:成功返回输出字节数,出错返回负值
int sprintf(char *restrict buf, const char *restrict format, ...);
int snprintf(char *reatrict buf, size_t n, const char *restrict format, ...);	//两个函数返回值:成功返回存入数组的字符数,出错返回负值
格式化的输入函数

int scanf(cosnt char *restrict format, ...);
int fscanf(FILE *restreict fp, const char *restrict format, ...);
int sscanf(const char *restrict buf, const char *restrict format, ...);	//三个函数返回值:指定的输入项数,若输入出错或在任意变换前到达文件尾返回EOF

第6章 系统数据文件和信息

6.2 口令文件


struct passwd *getpwuid(uid_t uid);
struct passwd *getpwnam(cosnt char *name);	//这两个函数成功返回指针,出错返回NULL
struct passwd *getpwent(void);		//返回值:成功返回指针,出错或到达文件尾返回NULL
void setpwent(void);
void endwent(void);
        getpwuid和getpwnam获得用户登录名或树枝ID的相关项,调用getpwent时,它返回口令文件中的写一个记录项。

        getpwent()用来从密码文件(/etc/passwd)中读取一项用户数据,该用户的数据以passwd 结构返回。第一次调用时会取得第一位用户数据,之后每调用一次就会返回下

一项数据,直到已无任何数据时返回NULL。getpwent()在第一次调用时会打开密码文件,读取数据完毕后可使用endpwent()来关闭该密码文件。错误代码ENOMEM 内存不

足,无法配置passwd结构。

------------>>>>>>>>>测试程序

#include "apue.h"
#include <pwd.h>

int main(void)
{
    struct passwd *p;

    p = getpwnam("luoxn28");
    printf("%d -> %s\n", p->pw_uid, p->pw_name);
    p = getpwuid(1000);
    printf("%d -> %s\n\n", p->pw_uid, p->pw_name);

    while((p = getpwent()) != NULL)
        printf("%d -> %s\n", p->pw_uid, p->pw_name);

    endpwent();
    exit(0);
}

6.4 组文件


struct group *getgrgid(gid_t gid);
struct group *getgrnam(const char *name);		//两个函数返回值:成功返回指针,出错NULL
struct group *getgrent(void);					//返回值:成功返回指针,出错NULL
void setgrent(void);
void endgrent(void);
        这几个函数和口令文件函数的操作时一样的。

6.8 登陆账户信息

        utmp文件,它记录当前登陆进系统的各个用户;wtmp文件,它跟踪各个登录的注销事件。

6.9 系统标识

int uname(struct utsname *name);		//成功返回非负值,出错-1


        它返回当前主机和操作系统有关的系统

int gethostname(char *name, int namelen);		//返回值:成功0,出错-1

        namelen指定name缓冲区的长度

6.10 时间和日期例程

time_t time(time_t *calptr);		//返回值:成功返回事件值,出错-1
int gettimeofday(struct timeval *reatrict tp, void *restrict tzp);		//返回值:总是0
        time()函数总是作为函数值返回,如果参数不为空,则时间值也存放在由calptr指向的单元内

        与time函数相比,gettimeofday提供更高的分辨率(最高位微妙级)


struct tm *gmtime(const time_t *calptr);
struct tm *localtime(const time_t *calptr);	//两个返回值:指向tm结构的指针
time_t mktime(struct tm *tmptr);			//返回值:成功返回日历时间,出错-1
        localtime和gmtime之间区别:localtime将日历时间转换为本地时间,gmtime将日历时间转化为国际标准时间的年、月、日、时、分、秒、周、日

        函数mktime以本地时间的年月日等作为参数,将其转换为time_t值

char *asctime(const struct tm *rmptr);
char *ctime(const time_t *calptr);		//返回值:指向以NULL结尾的字符串的指针
        asctime和ctime产生26字节的字符串,asctime的参数指向年月日等字符串的指针,而ctime的参数指向日历时间的指针

6.11 小结

        所有UNIX系统都是用口令文件和组文件,附加组ID提供一个用户同时可以参加多个数组的方法


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值