您的位置:首页 > 编程语言

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

2014-10-05 12:03 561 查看
第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提供一个用户同时可以参加多个数组的方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐