《TCPL》 第7章 输入与输出

7.1 标准输入/输出

getchar()是最简单的输入机制,每次从标准输入中一次读取一个字符;int getchar(void);

输入一般来自键盘,可以重定向从文件中,比如prog是一个程序prog<infile将从infile中读取输入。

putchar()用于输出数据。int putchar(int),它返回输出的字符,如果失败则返回EOF。

同理可以重定向输出,如prog>outfile。

事实上getchar()与putchar()在头文件stdio中都是宏,并不是真正的函数。

7.2 格式化输出——printf函数

printf的原型为:int printf(char *format,arg1,arg2, …);

在转换说明中,宽度或精度可以用星号*表示,这时,宽度或精度的值通过转换下一参数(必须为int)来计算。例如,为了从字符串s中打印最多max个字符,可以使用下列语句:

printf("%.*s",max,s);

上面语句中max是一个变量,打印s中最多max个字符。

sprintf函数格式转换功能与printf一样,但是它将输出保存在一直字符串中。

int sprintf(char *string,char *format,arg1,arg2,…);

7.3 变长参数表

这里实现了一个简化的printf函数minprintf

7.4 格式化输入——scanf函数

int scanf(char *format, …)

函数返回成功匹配并赋值的输入项的个数。

另一个sscanf用于从一个字符串中读取字符序列。

int sscanf(char *string, char *format, arg1, arg2,…);

它按照format中规定的格式扫描字符串string,并把结果分别保存到arg1,arg2这些参数中,这些参数必须为指针。

如果scanf的转换说明中的赋值禁止符*,则跳过该字段,不进行赋值。

如果要读取格式不固定的输入,最好每次读入一行,然后再用sscanf将合适的格式分离出来读入。例如,我们需要读入一些包含日期的输入行,日期的格式可能是以下任一种形式。

18 Oct 2013

10/18/2013

while(getline(line,sizeof(line)) > 0)
{
    if(sscanf(line,"%d%s%d",&day,month,&year)==3)
        printf("valid:%s\n",line);
    else if(sscanf(line,"%d/%d/%d",&month,&day,&year)==3)
        printf("valid:%s\n",line);
    else
        printf("invalid:%s\n",line);
}

7.5 文件访问

fopen函数用于打开文件,它返回一个指向FILE的指针。FILE *fopen(char *name, char *mode);

其实 name为文件名,mode为访问格式。如果打开一个不存在的文件并且以写或追加的方式,则文件将被创建。如果打开出现错误则返回NULL。

int getc(FILE *fp)

getc函数返回fp指向的输入流中的下个字符。如果达文件尾或出现错误,该函数将返回EOF。

int putc(int c, FILE *fp)

该函数将字符c写入到fp指向的文件中,并返回写入的字符。如果发生错误,则返回EOF。

启动一个C程序时,操作系统负责打开3个文件:标准输入,标准输出,标准错误。相应的指针分别为stdin,stdout,stderr。

对文件的格式输入或输出,可以使用函数fscanf和fprintf。

int fprintf(FILE *fp,char *format, …);
int fscanf(FILE *fp,char *format, …);

7.6 错误处理

一般情况下,我们将程序中的错误信息输出到单独的通道中,通过用stderr与stdout区分。下面我们来看cat程序将命令行输入的文件名内的内容都打印到屏幕上。

/*cat程序用于连接多个文件*/
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
    FILE *fp;
    while(--argc>0)
    {
        if((fp=fopen(*++argv,"r"))!=NULL)
        {
            filecopy(stdout,fp);
            fclose(fp);
        }
        else
        {
            fprintf(stderr,"can't open %s.",*argv);
            exit(1);
        }
    }
    if(ferror(stdout)){
        fprintf(stderr,"%s:error writeing stdout\n",argv[0]);
        exit(2);
    }
    exit(0);
}

void filecopy(FILE *ifp,FILE *ofp)
{
    int c;
    while((c=getc(ifp))!=EOF)
        putc(c,ofp);
}

如果fp中出现错误,则函数ferror返回一个非0值。

int ferror(FILE *fp)

尽管输出错误很少出现,但还是存在的。

函数feof(FILE*)与ferror类似。如果指定文件到达文件结尾,它将返回一个非0值。

int foef(FILE *fp);

7.7 行输入和行输出

标准库提供了一个输入函数与输出函数fgets函数与fputs函数

char *fgets(char *line, int maxline, FILE *fp);
int fputs(char *line,FILE *fp);

fgets函数用于从fp指向的文件中读取下一个输入行(包括换行符),并将它存放在字符数组line中,它最多可以读取maxline-1个字符。读取结尾将以’\0’结尾保存到数组中。如果遇到了文件结尾或发生了错误,则返回NULL。

输出函数fputs函数将一个字符串(不需要包含换行符)写入到一个文件中。如果发生错误,该函数返回EOF,否则返回一个非负值。

库函数gets和puts的功能与fgets和fputs有类似的功能,但是它们是对stdin与stdout进行操作。

值得注意的是,gets函数在读取字符串时将删除结尾的换行符,而puts函数在写入字符串时将在结尾添加一个换行符。

7.8 其他函数

字符串操作函数:string.h

字符类别测试和转换函数:ctype.h

ungetc函数将字符c写回到文件fp中。如果执行成功返回c,否则返回EOF。int ungetc(int c,FILE *fp)

system(char *s)系统命令。

存储管理函数malloc,calloc,free

数学函数:math.h

你可能感兴趣的:(tcp)