由单字符I/O扩展到C语言之重定向和文件

本文介绍了C程序中stdio.h头文件的作用,讲解了getchar()、putchar()等函数的使用,以及标准I/O的缓冲机制,包括完全缓冲和行缓冲。此外,还阐述了C程序如何通过流处理输入输出,并提到键盘(stdin)、屏幕(stdout)作为默认的输入输出流。文章进一步讨论了文件重定向的概念,包括如何将输入输出重定向到文件,以及重定向操作的规则和注意事项。
摘要由CSDN通过智能技术生成

一、C程序中要包含stdio.h头文件才可以直接使用putchar()、getchar()(其实,getchar()和putchar()都不是真正的函数,它们被定义为供预处理器使用的宏)、printf()函数,scanf()函数,它们都是C语言标准I/O包的成员。

二、ANSI C 和后续的C标准都规定输入是缓冲的。缓冲区的大小取决于系统,常见大小512字节和4096字节。
缓冲分为两类,完全缓冲I/O和行缓冲I/O。
完全缓冲输入指的是当缓冲区被填满时才刷新缓冲区(内容被发送到目的地《比如说C程序》),通常出现在文件输入中。
行缓冲I/O指的是在出现换行符时刷新缓冲区。键盘输入通常是行缓冲输入,所以在按下 Enter键后才刷新缓冲区。

三、从概念上看,C程序处理的是流而不是直接处理文件。流(stream)是一个实际输入或输出映射的理想化数据流。这意味着不同属性和不同种类的输入,由属性更统一的流来表示。于是。打开文件的过程就是把流与文件相关联,而且读写都由流来完成。

C把输入和输出设备视为存储设备上面的普通文件,尤其是把键盘和显示设备视为每个C程序自动打开的文件。stdin流表示键盘输入,stdout流表示屏幕输出。putchar()、getchar()函数、printf()函数,scanf()函数处理这两个流。

无论操作系统使用何种方法检测文件结尾,在C语言中,用getchar()读取文件检测到文件结尾时将返回一个特殊的值,即EOF(end of life),scanf()函数检测到文件结尾时也返回EOF。
通常EOF定义在stdio.h中;#define EOF (-1) ----这表示EOF是一个明示常量(manifest constant)(也叫作符号常量)。
#define EOF (-1) 待写
也叫宏,宏的名称中不允许有空格,而且必须遵循C变量的命名规则:只能使用字符、数字和下划线(_)字符,而且首字符不能是数字。
Linux,UNIX风格模拟文件结尾(按下Ctrl+D),在Windows PC中,要按下Ctrl+Z。

#include <stdio.h>

int main(void)
{
    int ch;		//用int类型的原因是EOF的值是-1,而无符号的char类型就读取不了EOF,
    			//getchar()函数的返回类型是int,虽然说将ch声明为unsigned char类型也行,但是将ch声明为int类型更通用
    printf("%d\n",EOF);
    while((ch = getchar()) != EOF)  //这一行也可以写while((scanf("%c",&ch)) != EOF)
        putchar(ch);
    return 0;
}

运行截图如下:
运行截图
.
四、重定向和文件
重定向运算符:(< 和 >)
上面的程序还有查看文件内容,创建一个新文件,拷贝文件的潜力
重定向输入让程序使用文件而不是键盘来输入,重定向输出让程序输出至文件而不是屏幕
1、重定向输出至文件,同目录下不存在这个文件就会创建一个新文件。
重定向输出
a.txt
若同目录下重定向输出所对应的文件已经存在,则通常会擦除该文件的内容,然后替换新的内容。
如图:
a.txt文件已存在
结果图
.

2、重定向输入使用文件,查看文件内容
重定向输入
.
3、拷贝文件(用到了组合重定向)
拷贝文件a.txt 并生成新文件 b.txt
注意:组合重定向中命令和重定向运算符的顺序无关
注意:输入文件名和输出文件名不能相同
—原因:重定向输出至文件之前,原文件已导致原文件的长度被截断为0。
拷贝文件

b.txt
不管是组合重定向还是单个方向的重定向,都有一些规则需要遵守:
①:重定向运算符连接一个可执行程序(包括标准操作系统命令)和一个数据文件,不能用于连接一个数据文件和另一个数据文件,也不能用于连接一个程序和另一个程序。
②:使用重定向运算符不能读取多个文件的输入,也不能把输出定向至多个文件。
③:通常,文件名和运算符之间的空格不是必须的,除非是偶尔在UNIX shell,Linux shell 或 Windows 命令行提示模式中使用的有特殊含义的字符。
另外两点值得注意(就是上面两个标黄的注意)
④:组合重定向中命令和重定向运算符的顺序无关
⑤:输入文件名和输出文件名不能相同

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菩提one

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值