1、 getchar() 和putchar()
一个一个字符的读取和输出
2、以上宏使用缓存区进行输出刷新
两种缓冲区:
1、完全缓冲区 fully buffered
当缓冲区满的时候被清空,即缓冲区满的时候将内容刷新到目的地。一般出现在文件输入中。 缓冲区大小一般为512或者4096字节
2、行缓冲区: line buffered
当遇到换行符的时候,就将缓冲区的内容进行清空,刷新。例如:键盘输入是标准的行缓冲。
3、c中getchar() 在到达文件结尾时返回一个特殊值,而不去管操作系统是如何检测文件结尾的。赋予该值的名称是EOF(end of file),所以监测到文件结尾的返回值是EOF。同样scanf()也是通过检测EOF来判断是否已经到文件尾部。
EOF 在stdio.h中进行定义: #defien EOF (-1)
-1 值不出现在ASCII 码表中,而且是负值。
注释: c语言实际判断文件是否到达尾部的方法是: 判断当前读取的位置与文件的大小进行比较,如果两个值相同那么说明已经到了文件的尾部,这时候读取文件的函数返回EOF。
一般情况下,现代操作系统都是如此处理是否到达文件尾部的。
注释2: 早期MS_DOS系统通过在文件的尾部添加^z 来表示文件尾部,也就是说,只要读取到^z 该字符就表示已经读取到了文件尾部。
注释3:
window系统文件:
行尾是使用的\r\n
linux 系统文件:
行尾是使用的\n
因此window文件拷贝到linux下格式是不正确的,尤其是可执行的脚本文件将会发生错误。
注释4: 如果要是通用getchar()中输入结束符号EOF,则必须知道该操作系统结束标记是什么,不可简单的输入EOF、-1 来结束输入。有些系统是痛ctrl+D, 有些系统是痛ctrl+z等
4、重定向
< 重定向输入
> 重定向输出
/* echo.c -- */
#include <stdio.h>
int main(void)
{
char ch;
while((ch=getchar()) != EOF)
{
putchar(ch);
}
return 0;
}
编译对象为a.out
执行: a.out < filename 将文件filename中的内容输入到a.out程序中
执行: a.out > filename 将输入流中的内容,重定向输出到filename文件中。
文件拷贝: 多个重定向
a.out < sourcefile > distiname 将sourcefile文件拷贝到distiname文件中
5、实例代码:打印文件内容
/* file_eof.c -- */
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char ch;
FILE * fp;
char fname[50];
printf("Please enter the name of the file:");
scan("%s",fname);
fp = fopen(fname,"r");
if(fp == NULL)
{
printf("Failed to open file ");
exit(1);
}
while((ch=getc(fp)) != EOF)
{
putchar(ch);
}
fclose(fp);
return 0;
}
6 、
getchar 会获取每一个字符,不会遗漏任何字符
scanf 读取输入的时候会跳过空白字符,包括制表符、空白符、换行符。即scanf以遇到的第一个空白符为一个整体进行输入读取。返回值成功读取到的数据个数。
7、在c语言的输入输出函数中尤其要注意:空白字符和换行符号等不可见字符对程序的影响。