《C程序设计语言》笔记 (七) 输入 输出

7.1 标准输入输出

输入输出功能并不是C语言本身的组成部分

标准库实现了简单的文本输入输出模式

文本流由一系列行组成,每一行的结尾是一个换行符

最简单的输入机制是使用getchar函数从标准输入中(一般为键盘),一次读取一个字符

int getchar(void);

getchar函数每次被调用时返回下一个输入字符

若遇到文件结尾,则返回EOF

符号常量EOF在头文件<stdio.h>中定义,其值一般为-1

但程序中应该使用EOF来测试文件是否结束,这样才能保证程序同EOF的特定值无关

在许多环境中可以使用符号<来实现输入重定向,他将把键盘输入替换为文件输入

int putchat(int);
用于输出数据

putchar(c) 将字符c送至标准输出上,在默认情况下,标准输出为屏幕显示

如果没有发生错误,则函数putchar将返回输出的字符;如果发生错误则返回EOF

prog > 输出文件名  //重定向

prog | anotherprog  //管道

将把程序prog的输出从标准输出通过管道重定向到程序anotherprog的标准输入中

函数printf也向标准输出设备上输出数据

使用输入输出库函数必须引入头文件
#include <stdio.h>

当文件用一对尖括号<>扩起来时,预处理器将在由具体实现定义的有关位置中查找指定的文件(一般 /usr/include)

#include <stdio.h>
#include <ctype.h>

main()
{
  int c;
  while((c = getchar()) != EOF)
    putchar(tolower(c));
  return 0;
}

函数tolower在头文件<ctype.h>中定义,它把大写字母转换为小写,其他字符原样返回

我们在前面提到过,头文件<stdio.h>中的getchar和putchar 函数以及<ctype.h>中的函数 一般都是宏,这样就可以避免了对每个字符都进行函数调用的开销

  

7.2 格式化输出--printf函数

输出函数printf将内部数值转换为字符的形式

int printf(char *format,arg1,arg2,...);

函数printf在输出格式format的控制下,将其参数进行转换与格式化,并在标准输出设备上打印出来

格式字符串包含两种类型的对象:普通字符和转换说明

普通字符将原样复制到输出流中,而转换说明并不直接输出到输出流中,而是用于控制printf函数中参数的转换和打印

每个转换说明由%开始,并以一个转换字符结束

在字符%和转换字符中间可能包含下列组成

负号:用于指定被转换的参数按照左对齐的形式输出

数:用于指定最小字段宽度.转换后的参数将打印不小于最小字段宽度。如果有必要,字段左边多余的字符位置用空格填充

小数点:用于将字段宽度和精度分开

数,用于指定精度,即指定字符串中要打印的最大字符数 浮点数小数后的位数,整形最少输出的数字

字母h或l,字符h表示将整数作为short类型打印,字母l表示作为long类型打印

函数sprintf执行的转换和函数printf相同,但它将输出保存到一个字符串中

  

7.3  变长参数表

函数printf的正确声明形式为

int printf(char *fmt,...)

其中省略号表示参数表中参数的数量和类型是可变的

省略号只能出现在参数表的尾部

标准头文件<stdarg.h>中包含一组定义,他们对如何遍历参数表进行了定义

该头文件的实现因不同机器而不同,但提供的接口是一致的

va_list类型用于声明一个变量,该变量将依次引用各参数

宏va_start将ap初始化为指向第一个无名参数的指针

参数表必须包括一个有名参数,va_start将最后一个有名参数作为起点

每次调用va_arg,该函数 都将返回一个参数,并将ap指向下一个参数。

va_arg使用一个类型名来决定返回的对象类型 指针移动的步长

最后必须在函数返回之前调用va_end 以完成必要的清理工作

  

7.4 格式输入--scanf函数

输入函数scanf对应于输出函数printf,他在于后者相反的方向上提供同样的转换功能

另外还有一个输入函数sscanf,用于从一个字符串中读取字符

  

7.5 文件访问

标准输入和输出是操作系统自动提供给程序访问的

在读写文件前,必须通过库函数fopen打开一个文件,并返回一个随后可以用于文件读写操作的指针

该指针称为文件指针,它指向一个包含文件信息的结构

包括:缓冲区的位置、缓冲区当前字符的位置、文件的读写状态 是否出错 是否已经到达文件的结尾等等

<stdio.h> 定义了包含这些信息的结构FILE,在程序中只需

FILE *fp;
FILE *fopen(char *name,char *mode);

fp是一个指向结构FILE的指针,并且,fopen函数返回一个指向结构FILE的指针

FILE像int一样是一个类型名,而不是结构标记,它是通过typedef定义的

在程序中,可以这样调用fopen函数

fp = fopen(name,mode);

fopen第一个参数是字符串,它包含文件名

第二个参数是访问模式,也是一个字符串。用于指定文件的使用方式

允许的模式包括:
读(r)写(w)及追加(a)

某些系统还区分文本文件和二进制文

对二进制文件的访问需要在模式字符串中增加字符"b"

如果打开一个不存在的文件用于写或追加,该文件将被创建

当以写的方式打开一个已存在的文件时,该文件原来的内容将被覆盖

读一个不存在的文件会导致错误

其他一些操作也可能错误 ,如权限

如果发生错误,fopen将返回NULL

文件打开后,就需要考虑采用哪种方法读写
其中getc和putc最简单

int getc(FILE *fp);

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

putc是一个输出函数 

int putc(int c,FILE *fp);

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

类似于getchar和 putchar  getc和putc是宏而不是函数

启动一个C语言程序时,操作系统环境负责打开3个文件,并将这3个文件的指针提供给该程序

分别是标准输入 标准输出和标准错误

相应的文件指针分别为stdin stdout 和stderr


在大多数环境 stdin=键盘
stdout=stderr=显示器

stdin和stdout可以重定向到文件或管道

对于文件的格式化输入和输出 可以使用fscanf和fprintf 
它们和scanf和printf的区别在于它们的第一个参数指向要读写的文件指针

int fscanf(FILE *fp,char *fmt,...);
int fprintf(FILE *fp,char *fmt,...);

文件指针stdin和stdout都是FILE*类型的对象,但它们是常量

int fclose(FILE *fp);
执行和fopen相反的操作,它断开由fopen建立的文件指针和外部名之间的链接
释放文件指针以供其他文件使用
当程序正常终止时,程序会自动为每个打开的文件调用fclose函数

如果不需要stdin和stdout,可以关掉它们,也可以通过库函数freopen重新指定它们

  

  

7.6 错误处理--stderr和exit

stderr标准错误


exit函数 :当该函数被调用时,将终止调用程序的执行

任何调用该程序的进程都可以获取exit的参数值,因此,可通过另一个将该程序作为子进程的程序来测试程序执行是否成功

返回0表示一切正常,而非0表示异常

  

7.7 行输入和行输出

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

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

fgets函数从fp指向的文件中读取下一个输入行,并将它存放在字符数组line中

它最大可以读取maxline-1个字符,读取的行将以"\0"结尾保存到数组中

通常情况下fgets返回line,但如果遇到了文件结尾或发生错误, 返回NULL


fputs函数将一个字符串写入到一个文件中

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

错误返回EOF,否则返回非负值

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

gets函数在读取字符串时将删除结尾的换行符("\n"),而puts函数在写入字符串时将在结尾添加一个换行符

  

7.8 其他函数

7.8.1 字符串操作函数

strcat(s,t)  将t指向的字符串连接到s指向的字符串末尾

strncat(s,t,n); 将t指向的字符串前 n 个字符连接到s指向的字符串末尾

strcmp(s,t) 根据s指向的字符串 小于 等于 大于 t指向的字符串的不同情况,分别返回 负整数 0 或正整数

strncmp(s,t,n) 和strcmp相同,但只比较前n个字符

strcpy(s,t)  将t指向的字符串复制到s指向的位置

strncpy(s,t,n) 将t指向的字符串中前n 个字符复制到s指向的位置

strlen(s) 返回字符的长度

strchr(s,c) 在s指向的字符串中查找c,若找到,返回指向它第一次出现位置的指针,否则返回NULL

strrchr(s,c) 在s指向的字符串中查找c,若找到,返回最后一次出现的位置指针,否则返回NULL

  

7.8.2 字符类别测试和转换函数

isaplha(c) 若c是字母,返回非0,否则返回0

isupper(c)大写字母

islower(c)小写字母

isdigit(c)数字

isalnum(c) 字母或数字

isspace(c)空格

toupper(c)返回大写

tolower(c)返回小写

  

7.8.3 ungetc函数

标准库提供了一个称为ungetc的函数

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

每个文件只能接收一个写回字符

ungetc函数可以和任何一个输入函数一起使用

  

7.8.4 命令执行函数

函数system(char *s)、执行包含在字符串s中的命令,然后继续执行当前程序。

s的内容在很大程度上和所用的操作系统有关

例如 :

system("date");
将执行程序date,它在标准输出上打印当天的日期和时间

system函数返回一个整形的状态值,其值来源于执行的命令

在UNIX系统中,返回的状态是exit的返回值

  

7.8.5存储管理函数

函数malloc和calloc用于动态分配存储块

void *malloc(size_t n)

分配成功,返回一个指针,该指针指向n字节长度的为初始化存储空间,否则返回NULL


void *calloc(size_t n,size_t size);

分配成功,返回一个指针,该指针指向的空闲空间足以容纳由n个指定长度的对象组成的数组,否则返回NULL。该存储空间被初始化为0;

根据请求对象的类型,malloc或calloc函数返回的指针满足正确的对齐要求

free(p)函数释放指针p指向的存储空间,其中p是此前通过调用malloc或calloc函数得到的指针。

存储空间的释放顺序没有什么限制,但是如果释放一个不是通过malloc或calloc函数得到的指针所指向的存储空间,将是一个很严重的错误

使用已经释放的存储空间同样是错误

  

7.8.6 数学函数

sin(x) x的正弦函数,x用弧度表示

cos(x) x的余弦函数,x用弧度表示

atan2(y,x) y/x的反正切函数,x和y用弧度表示

exp(x) 指数函数

log(x) x的自然对数

log10(x) x的常用对数

pow(x,y)  计算x 的y次方值

sqrt(x)  平方根

fabs(x)  绝对值

  

7.8.7 随机数发生器函数

函数rand()生成0~RAND_MAX之间的伪随机整数

其中RAND_MAX是在头文件<stdlib.h>中定义的符号常量

函数srand(unsigned)设置rand函数的种子数

  

原文地址:https://www.cnblogs.com/dafume/p/7808059.html