C 语言提供了一些函数,用于与外部设备通信,称为输入输出函数,简称 I/O 函数。输入(import)指的是获取外部数据,输出(export)指的是向外部传递数据。
一)输入输出函数如何工作的 ?什么是缓存和字节流?
严格地说,输入输出函数并不是直接与外部设备通信,而是通过缓存(buffer)进行间接通信。这个小节介绍缓存是什么。
普通文件一般都保存在磁盘上面,跟 CPU 相比,磁盘读取或写入数据是一个很慢的操作。所以,程序直接读写磁盘是不可行的,可能每执行一行命令,都必须等半天。C 语言的解决方案,就是只要打开一个文件,就在内存里面为这个文件设置一个缓存区。
程序向文件写入数据时,程序先把数据放入缓存,等到缓存满了,再把里面的数据会一次性写入磁盘文件。这时,缓存区就空了,程序再把新的数据放入缓存,重复整个过程。
程序从文件读取数据时,文件先把一部分数据放到缓存里面,然后程序从缓存获取数据,等到缓存空了,磁盘文件再把新的数据放入缓存,重复整个过程。
内存的读写速度比磁盘快得多,缓存的设计减少了读写磁盘的次数,大大提高了程序的执行效率。另外,一次性移动大块数据,要比多次移动小块数据快得多。
这种读写模式,对于程序来说,就有点像水流(stream),不是一次性读取或写入所有数据,而是一个持续不断的过程。先操作一部分数据,等到缓存吞吐完这部分数据,再操作下一部分数据。这个过程就叫做字节流操作。
由于缓存读完就空了,所以字节流读取都是只能读一次,第二次就读不到了。这跟读取文件很不一样。
C 语言的输入输出函数,凡是涉及读写文件,都是属于字节流操作。输入函数从文件获取数据,操作的是输入流;输出函数向文件写入数据,操作的是输出流。
二)C语言字符和字符串的输入函数
在编写要求用户输入的交互式程序(人机对话)时,C语言提供了scanf(),gets()和fgets(), putchar (), getchar()函数来查找从用户输入的一行文本。
1. getchar 函数(键盘输入函数)
getchar 函数的功能是从键盘上输入一个字符。
其一般形式为:
getchar();
通常把输入的字符赋予一个字符变量,构成赋值语句,如:
char c;
c=getchar();
例2.1. 输入并打印出一个字符
#include<stdio.h> void main() { char c; printf("input a character\n"); c=getchar(); putchar(c); }
使用 getchar 函数还应注意几个问题:
- getchar 函数只能接受单个字符,输入数字也按字符处理。输入多于一个字符时,只接收第一个字符;
- 使用本函数前必须包含文件“stdio.h”;
- 在 TC 屏幕下运行含本函数程序时, 将等待用户输入一个字符。显示结果后,再输入字符将会推出运行;
- 程序最后两行可用下面两行的任意一行代替:
putchar(getchar());
printf(“%c”,getchar());
2. scanf()函数
当我们使用 scanf()进行读取字符串时,我们使用“%s”格式,而不使用“&”访问变量地址,因为数组名称充当指针, 下面例子name[ ]相当于数组,字符串按指针处理,我们下一章将讲指针 。
scanf()
函数用于读取用户的键盘输入。程序运行到这个语句时,会停下来,等待用户从键盘输入。用户输入数据、按下回车键后,scanf()
就会处理用户的输入,将其存入变量。它的原型定义在头文件stdio.h
。详细的scanf应用请看输入输出函数。
scanf()
的语法跟printf()
类似。对于字符串输入,scanf()的语法:
scanf ("%s", strname);
例2.2 scanf()函数输入字符串
#include <stdio.h> int main() { char name[10]; int age; printf("Enter your first name and age: \n"); scanf("%s %d", name, &age); printf("You entered: %s %d",name,age); }
scanf函数的最大问题在于它从不读取整个字符串。 一旦出现空格,换页,垂直制表符,换行符或回车,它将停止读取过程。
假设我们以“2743 com”作为输入,则scanf函数将永远不会读取整个字符串,因为两个名称之间会出现空格字符。 scanf函数将仅读取2743。
3. gets()函数
gets函数将忽略空格。 当到达换行符时(按Enter键)它将停止读取。语法:
gets(Strname)
例2.3. gets()函数的应用
#include <stdio.h> int main() { char full_name[25]; printf("Enter your full name: "); gets(full_name); printf("My full name is %s ",full_name); return 0; }
4. fgets() 函数
更安全的函数是fgets(), 可以读取特定数量的字符:
语法:
fgets(Strname, 10, stdin);
gets()的参数为:
- 字符串名称,
- 要读取的字符数,
- stdin表示从标准输入(这儿是键盘输入)中读取数据
例2.4. fgets() 函数的应用
#include <stdio.h> int main() { char name[10]; printf("Enter your name plz: "); fgets(name, 10, stdin); printf("My name is %s ",name); return 0; }
三)C语言字符和字符串的输出函数
1. putchar 函数(字符输出函数)
putchar 函数是字符输出函数, 其功能是在显示器上输出单个字符。
其一般形式为:
putchar(Varchar);
例如:
putchar(‘A’); (输出大写字母 A)
putchar(x); (输出字符变量 x 的值)
putchar(‘\101’); (也是输出字符 A)
putchar(‘\n’); (换行)
对控制字符则执行控制功能,不在屏幕上显示。使用本函数前必须要用文件包含命令:
#include<stdio.h>
或
#include “stdio.h”
例3.1 putchar()函数的应用
#include<stdio.h> main() { char a='B',b='o',c='k'; putchar(a);putchar(b);putchar(b);putchar(c);putchar('\t'); putchar(a);putchar(b); putchar('\n'); putchar(b);putchar(c); }
2. fputs() 函数
fputs()需要字符串的名称,和指向显示文本位置的指针。语法:
fputs(Strname, stdout);
我们使用stdout标准输出打印到屏幕上.
例3.2 fputs()函数的应用
#include <stdio.h> int main() { char town[40]; printf("Enter your town: "); gets(town); fputs(town, stdout); return 0; }
3.puts() 函数
puts函数在输出设备上打印字符串,然后将光标移回第一位置。 可以通过以下方式使用puts函数:
puts(Strname);
例3.3 puts()函数的应用
#include <stdio.h> int main() { char name[15]; gets(name); //reads a string puts(name); //displays a string return 0; }