C输入输出综述 6.1c输入输出综述 入输出操作是由函数来实现的 C语言函数库中有“标准输入输出函数 字符的输入与输出: getchar(、 putchar0 字符串的输入与输出 tso tso 格式输入与输出: scanf(、 printf 在使用C语言库函数时,要用预编译命令“# include”将有关的“头文件”包括到用户源文件 例如:使用标准输入输出库函数时,要用到“ stdio.h”文件,在源文件开头应有 # include< stdio.h>或# include“ stdio.h” (一)字符数据的输入输出 字符输出函数 语法: putchar(c) 语义:(向 stdout终端)输出一个字符 如:# include< stdio.h> maIn putchar(141’) putchar(‘a’); putchar(‘A’+32) putchar(‘n’); 2、字符输入函数 语法: getchar(),是一个无参函数 语义:(从 stdin终端上)输入一个字符 getchar包含在 stdio.h中,是 stdio.h中定义的宏;
C 输入输出综述 6 . 1 C 输入输出综述 输入输出操作是由函数来实现的 C 语言函数库中有“标准输入输出函数” 字符的输入与输出:getchar()、putchar() 字符串的输入与输出: gets() 、puts() 格式输入与输出: scanf() 、printf() 在使用 C 语言库函数时,要用预编译命令“#include”将有关的“头文件”包括到用户源文件 中。 例如:使用标准输入输出库函数时,要用到“stdio.h”文件,在源文件开头应有: #include <stdio.h> 或 #include “stdio.h” (一)字符数据的输入输出 1、字符输出函数——putchar 语法:putchar(c) 语义:(向 stdout 终端)输出一个字符; 如:#include <stdio.h> main() { putchar(‘\141’); putchar(‘a’); putchar(‘A’+32); putchar(‘\n’); } 输 出:aaa 2、字符输入函数——getchar 语法:getchar ( ),是一个无参函数; 语义:(从 stdin 终端上) 输入一个字符; getchar 包含在 stdio.h 中,是 stdio.h 中定义的宏;
Ind in 从键盘上输入一串字符遇“#’结束,若字符在a~z之间时,则输出字符的大写:否则直接 输出字符。 (二)格式输入与输出 格式输出函数— printf 语法: printf(“格式控制”,输出表列) 格式控制:是用双引号括起来的字符串,包含两种信息: 普通字符和转义字符(这类字符总是原样输出) 格式说明:由%和格式控制符组成。 若a、b的值分别为2和3,则输出结果为:a=2,b=3 格式输入函数 语法: scanf(“格式控制”,地址表列) 格式控制:包含三类符号 空白字符:(空格、Tab或\t、\n),输入时不必一一对应 普通字符:(非格式转换说明符、非空白符、非%),输入时必须一一对应 格式转换说明符 (由%后接一个任选的压缩指示符“*”,表示本输入项在读入后不赋给相应的变量) main
如:#include <stdio.h> main( ) { putchar(getchar( )); } 从键盘上输入一串字符遇‘#’结束,若字符在 a~z 之间时,则输出字符的大写;否则直接 输出字符。 (二) 格式输入与输出 1、格式输出函数——printf 语法:printf (“格式控制”, 输出表列); 格式控制:是用双引号括起来的字符串,包含两种信息: 普通字符和转义字符(这类字符总是原样输出) 格式说明:由%和格式控制符组成。 如:%d, %f 等;(P77) 如:printf(“a=%d, b=%d”,a,b); 若 a、b 的值分别为 2 和 3,则输出结果为: a=2, b=3 2、格式输入函数 scanf 语法:scanf(“格式控制”,地址表列); 格式控制:包含三类符号 空白字符:(空格、Tab 或\t、\n),输入时不必一一对应; 普通字符:(非格式转换说明符、非空白符、非%),输入时必须一一对应; 格式转换说明符: (由%后接一个任选的压缩指示符“*”,表示本输入项在读入后不赋给相应的变量) 例 1:#include <stdio.h> main()
f int a; float b: char str[50] anf(“%d%f%s”,&a,&b,str); 意: scanf函数规定,组成输入项表的输入对象须是地址量;如 scanf(“%d,%d,%d”,&a,&b,&c); scanf(“a=%d,b=%d,c=%d”,&a,&b,&c) ①第一个输入语句,正确的输入数据流为:123,456,789< enter>,处理的结果为: 123→a,456→b, 89→c ②同理对第二个输入语句,正确的输入数据流应是:a=123,b=456,c=789< enter> 该输入数据流中除123,456,789被赋给相应变量外,其余都被丢弃 文件概述 6.2文件概述 在C语言中,没有输入输出语句,对文件的读写都是用库函数来实现的。ANSI规 了标准输入输出函数,用它们对文件进行读写 为方便起见,操作系统(如UNIX,D0S)通常都把计算机系统中的设备抽象成文件 如把键盘抽象成输入文件,把显示器抽象成输出文件。在语言中只与文件打交道,而不必关心具体的 备,使用的文件都是逻辑意义上的文件。与此相应,所有设备都是逻辑概念上的设备。I/0函数库中 的函数都是针对文件或逻辑设备而言的。 C语言把文件看成是一个字符(字节)的序列。按数据的组织形式,分为AI文 和二进制文件。前者每一个字节存放一个 ASCII字符,后者把内存中的数据按其在内存重的存储形 远洋输出到磁盘上存放。前者占空间多,需要转换,后者节省空间和转换时间,但一个字节不对应 个字符,不能直接输出字符形式
{ int a; float b; char str[50]; scanf(“%d%f%s”,&a,&b,str); …… } 注意:scanf 函数规定,组成输入项表的输入对象须是地址量;如: scanf(“%d,%d,%d”,&a,&b,&c); scanf(“a=%d,b=%d,c=%d”,&a,&b,&c); ①第一个输入语句,正确的输入数据流为:123,456,789<enter>,处理的结果为: 123→a,456→b, 789→c ②同理对第二个输入语句,正确的输入数据流应是:a=123,b=456,c=789<enter> 该输入数据流中除 123,456,789 被赋给相应变量外,其余都被丢弃 文件概述 6 . 2 文件概述 在 C 语言中,没有输入输出语句,对文件的读写都是用库函数来实现的。ANSI 规 定了标准输入输出函数,用它们对文件进行读写。 为方便起见,操作系统(如 UNIX,DOS)通常都把计算机系统中的设备抽象成文件。 如把键盘抽象成输入文件,把显示器抽象成输出文件。在语言中只与文件打交道,而不必关心具体的 设备,使用的文件都是逻辑意义上的文件。与此相应,所有设备都是逻辑概念上的设备。I/O 函数库中 的函数都是针对文件或逻辑设备而言的。 C 语言把文件看成是一个字符(字节)的序列。按数据的组织形式,分为 ASCII 文 件和二进制文件。前者每一个字节存放一个 ASCII 字符,后者把内存中的数据按其在内存重的存储形 式远洋输出到磁盘上存放。前者占空间多,需要转换,后者节省空间和转换时间,但一个字节不对应 一个字符,不能直接输出字符形式
C语言中可利用高级I/0库函数来存取文件,存取文件的过程与其他语言中的处 理过程类似。通常按如下顺序进行: 打开文件 读写文件(若干次) 关闭文件 这个处理顺序表明:一个文件被存取之前首先要打开它,只有文件被打开后才能进行 读/写操作,文件读/写完毕后必须关闭 文件类指针与文件的打开、关闭 6.3文件类推针与文件的打开、关闭 文件的打开 在操作系统中,每一个文件都有一个名字以供识别,如存储在磁盘上的C源程序文件 ile1.c,file2.c等。文件名是文件的外部名,通过它可以找到文件的实际存储设备、位置、大 特性等诸如此类的相关信息。这些信息只能由操作系统的文件管理系统掌握与管理,因此要存取 文件必须通过操作系统的文件系统。这意味着一个C语言程序没有直接通过文件的外部名存取一个外 部文件的能力,程序中要存取文件必须与文件系统取得联系,把要存取文件的有关信息和要求,诸如 文件的名字、读文件还是写文件、以何种方式读/写等告诉文件系统,由文件系统在设备中建立、寻 找、定位文件,分配存取文件的缓冲区,做好存取文件要求的一切准备工作 上述存取文件的有关信息和要求都由程序通过I/0库函数 fopen告诉操作系统。 fopen函数的一般调用形式是
C 语言中可利用高级 I/O 库函数来存取文件,存取文件的过程与其他语言中的处 理过程类似。通常按如下顺序进行: … 打开文件 … 读写文件(若干次) … 关闭文件 这个处理顺序表明:一个文件被存取之前首先要打开它,只有文件被打开后才能进行 读/写操作,文件读/写完毕后必须关闭。 文件类指针与文件的打开、关闭 6 . 3 文件类指针与文件的打开、关闭 一、文件的打开 在操作系统中,每一个文件都有一个名字以供识别,如存储在磁盘上的 C 源程序文件 file1.c,file2.c 等。文件名是文件的外部名,通过它可以找到文件的实际存储设备、位置、大 小、特性等诸如此类的相关信息。这些信息只能由操作系统的文件管理系统掌握与管理,因此要存取 文件必须通过操作系统的文件系统。这意味着一个 C 语言程序没有直接通过文件的外部名存取一个外 部文件的能力,程序中要存取文件必须与文件系统取得联系,把要存取文件的有关信息和要求,诸如 文件的名字、读文件还是写文件、以何种方式读/写等告诉文件系统,由文件系统在设备中建立、寻 找、定位文件,分配存取文件的缓冲区,做好存取文件要求的一切准备工作。 上述存取文件的有关信息和要求都由程序通过 I/O 库函数 fopen 告诉操作系统。 fopen 函数的一般调用形式是:
fp= fopen(文件名,存取方式) 其中fp为缓冲区指针。缓冲文件系统,关键的概念是“文件指针”。每个被使用的 文件都在内存中开辟一个区,用来存放文件的有关信息(名、状态、当前位置等)。这些信息是保存 在一个结构体类型的变量中的。该结构体类型由系统定义,取名为FILE。有了FILE类型之后,可以用 来定义若干个FILE类型的变量,以便存放若干个文件的信息。 dn: FILE efile[-maxfilel, *fp 定义了一个结构体数组与一个指向FILE类型结构体的指针变量。可以使fp指向某 文件的结构体变量,从而通过该结构体变量中的文件信息访问该文件。也就是说,通过文件指针变 量能够找到与它相关的文件。如果有n个文件,一般应设n个指针变量(指向FLE类型结构体的指针 变量),使它们分别指向n个文件(确切地说,指向该文件的信息结构体),以实现对文件的访问。 “文件名”为要存取文件的外部名,它可以是字符串、字符数组名或指向文件名的 指针。“存取方式”以字符串的形式给出,用来指出如何存取文件。C语言允许的文件存取方式、含 及使用说明见书中表(P312)。 如:fp= fopen(“A1”,“r”) 它表示:要打开名字为A1的文件,使用文件方式“读入”, fopen函数带回指向A1 文件的指针并赋给fp,这样fp就和A1相联系了,或者说,fp指向A1文件。可以看出,在打开一个 文件时,通知给编译系统以下三个信息 ①需要打开的文件名,也就是准备访问的文件的名字 ②使用文件的方式(读还是写等) ③让哪一个指针变量指向被打开的文件。 、文件的关闭 在使用完一个文件后应该关闭它,以防止它再被误用。“关闭”就是使文件指针变量 不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对其相连的文件进行读 写操作,除非再次打开,使该指针变量重新指向该文件。用 fclose函数关闭文件 fclose函数调用的一般形式为: fclose(文件指针)
FILE *fp; fp=fopen(文件名,存取方式); 其中 fp 为缓冲区指针。缓冲文件系统,关键的概念是“文件指针”。每个被使用的 文件都在内存中开辟一个区,用来存放文件的有关信息(名、状态、当前位置等)。这些信息是保存 在一个结构体类型的变量中的。该结构体类型由系统定义,取名为 FILE。有了 FILE 类型之后,可以用 它来定义若干个 FILE 类型的变量,以便存放若干个文件的信息。 如:FILE _efile[-maxfile], *fp; 定义了一个结构体数组与一个指向 FILE 类型结构体的指针变量。可以使 fp 指向某一 个文件的结构体变量,从而通过该结构体变量中的文件信息访问该文件。也就是说,通过文件指针变 量能够找到与它相关的文件。如果有 n 个文件,一般应设 n 个指针变量(指向 FILE 类型结构体的指针 变量),使它们分别指向 n 个文件(确切地说,指向该文件的信息结构体),以实现对文件的访问。 “文件名”为要存取文件的外部名,它可以是字符串、字符数组名或指向文件名的一 个指针。“存取方式”以字符串的形式给出,用来指出如何存取文件。C 语言允许的文件存取方式、含 义及使用说明见书中表(P312)。 如:fp=fopen(“A1”,“r”); 它表示:要打开名字为 A1 的文件,使用文件方式“读入”,foprn 函数带回指向 A1 文件的指针并赋给 fp,这样 fp 就和 A1 相联系了,或者说,fp 指向 A1 文件。可以看出,在打开一个 文件时,通知给编译系统以下三个信息: ①需要打开的文件名,也就是准备访问的文件的名字。 ②使用文件的方式(读还是写等)。 ③让哪一个指针变量指向被打开的文件。 二、文件的关闭 在使用完一个文件后应该关闭它,以防止它再被误用。“关闭”就是使文件指针变量 不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对其相连的文件进行读 写操作,除非再次打开,使该指针变量重新指向该文件。用 fclose 函数关闭文件。 fclose 函数调用的一般形式为: fclose (文件指针);