C语言学习(十一)之字符输入/输出

article/2025/5/14 14:03:06

文章目录

  • 一、单字符I/O:getchar()和putchar()
  • 二、缓冲区
    • 2.1 什么是缓冲区
    • 2.2 为什么需要缓冲区
    • 2.3 缓冲区分类
      • 2.3.1 完全缓冲I/O
      • 2.3.2 行缓冲I/O
  • 三、结束键盘输入
    • 3.1 文件、流和键盘输入
    • 3.2 文件结尾
  • 四、重定向和文件
    • 4.1 重定向输入
    • 4.2 重定向输出
    • 4.3 组合重定向
    • 4.4 注意


一、单字符I/O:getchar()和putchar()

getchar()和putchar()每次都处理一个字符。

getchar() 是从键盘中接收字符。而putchar则是将接收的字符打印出来。

#include <stdio.h>int main(void){char ch;// 将接收的字符赋值给ch,如果ch不等于#,则继续输入。// 如果有#,则#后面的内容不会被打印出来。while ((ch = getchar()) != '#'){putchar(ch);}	return 0;
}

二、缓冲区

2.1 什么是缓冲区

用户输入的字符后立即重复打印该字符的是属于无缓冲(直接)输入,即正在等到的程序可立即使用输入的字符。

大部分系统在用户按下Enter键之前不会重复打印刚输入的字符,这种输入形式属于缓冲输入,用户输入的字符被收集并存储在一个被称为缓冲区的临时存储区,按下Enter键之后,程序才可使用用户输入的字符。


2.2 为什么需要缓冲区

当我们输入错误或打错字符时,可以通过键盘的删除键直接删除或回退,然后重新输入。当最后按下Enter键之后,输入的就是正确的字符。如果没有缓冲区,就没有办法修改。

虽然缓冲区有很多好处,但某些程序也需要无缓冲输入。所以,缓冲输入和无缓冲输入都需要。


2.3 缓冲区分类

缓冲分为两类:即完全缓冲I/O行缓冲I/O

2.3.1 完全缓冲I/O

完全缓冲输入指的是当缓冲区被填满时才刷新缓冲区(内容被发送至目的地),通常出现在文件输入中。缓冲区的大小取决于系统,常见的大小时512字节和4096字节。


2.3.2 行缓冲I/O

行缓冲I/O指的是在出现换行符时刷新缓冲区。键盘输入通常是行缓冲输入,所以按下Enter键后才刷新缓冲区。


三、结束键盘输入

在上述的程序中,只要输入的字符中不含#,程序就会一直打印出#前面的内容,直到读取到#后,程序就会停止打印输出。但有时我们就要用#号,所以这时就不能满足要求了。应该用一个文本中用不到的字符来标记输入完成,这样的字符不会无意间出现在输入的字符中。C提供了这样的字符,不过需要先了解C处理文件的方式。


3.1 文件、流和键盘输入

文件是存储器中存储信息的区域。通常,文件都保存在永久存储器中(例如:硬盘、U盘等)。毫无疑问,文件对于计算机系统相当重要。我们写的C程序就保存在文件当中。

C通过标准I/O包来处理文件。这涉及创建用于处理文件的标准模型和一套标准的I/O函数。

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


3.2 文件结尾

文件结尾就是要计算机操作系统要以某种方式判断文件的开始和结束。

一种方法是在文件末尾放置一个特殊的字符标记问价结尾(例如:CP/M、IBM-DOS和MS-DOS的文本文件曾经用过这种方法)。另一种方法是存储文件大小的信息。如果文件有3000字节,程序读到3000字节时便达到了文件的末尾。

在C语言中,用getchar()读取文件检测到文件结尾时将返回一个特殊的值,即EOF(end of file的缩写)。scanf()函数检测到文件结尾时也返回EOF。通常EOF定义在<stdio.h>文件中。

#define EOF    (-1)

上述代码中,将EOF定义为 -1 。为什么是-1呢?因为getchar()函数的返回值通常介于0~127,这些值对应标准字符集。但是,如果系统能识别扩展字符集,该函数的返回值可能在0~255。无论哪种情况,-1都不对应任何字符,所以该值可用于标记文件结尾。

如何使用EOF呢,还是以上面的代码为例:

#include <stdio.h>int main(void){// ch的类型改为int类型,是因为char只能表示0~255之间的无符号整数,//而EOF的值为-1。getchar()函数实际返回的值类型是int,所以它可以读取EOF的值int ch;// EOF在头文件中已经定义,在这里可以直接使用,不需要再次定义// while ((ch = getchar()) != EOF){putchar(ch);}return 0;
}

四、重定向和文件

程序可以通过两种方式使用文件。一种是,显式使用特定的函数打开文件、关闭文件、读取文件、写入文件,诸如此类。另一种是设计能与键盘和屏幕交互的程序,通过不同的渠道重定向输入至文件和从文件输出。

重定向的一个主要问题是它与操作系统有关,与C无关。


4.1 重定向输入

假设我们已经编译了上述程序,并生成了一个名为test.exe的可执行文件。

在这里插入图片描述
打开终端命令行,输入test.exe,回车,运行该程序
在这里插入图片描述
这就是在终端执行编译过后的C语言程序文件。运行的结果和编译器运行的结果一样。

假设你要用程序处理名为words的文本文件。文本文件时内含文本的文件,其中存储的数据是我们可识别的字符。文件的内容可以是一篇文章或者C程序。内含机器语言指令的文件(如存储可执行程序的文件)不是文本文件。
在这里插入图片描述
由于该程序的操作对象是字符,所以要使用文本文件。只需下面的命令即可。

test.exe < words.txt

输出结果如下:
在这里插入图片描述
上述命令中的“ < ”符号是重定向运算符。该运算符使words文件与stdin流相关联,把文件中的内容作为输入到test.c的程序中,并打印在屏幕上。

4.2 重定向输出

假设要用test.c把键盘输入的内容发送到名为mywords文件中,就可以使用重定向输出符完成操作。

test.c > mywords

输出结果:
在这里插入图片描述

重定向输出符“ > ” ,创建一个名为mywords的新文件,然后把test.c的输出重定向至该文件中。重定向把stdout从显示设备(显示器)赋给mywords文件。如果该文件已经存在,则会擦除文件中的内容写入新的内容。

4.3 组合重定向

组合重定向就是将重定向输入和重定向输出结合起来。

例如:将mywords文件拷贝一份,就可以使用下面命令:

test.exe < words > savemywords

在这里插入图片描述

也可以这样写,因为命令与与重定向的顺序无关。

test.exe > savemywords < words

注意,拷贝副本的文件名不能和原文件名一样。

4.4 注意

1、重定向运算符连接一个可执行程序(包括标准操作系统指令)和一个数据文件,不能用于连接一个数据文件和另一个数据文件,也不能用于连接一个程序和另一个程序。
2、使用重定向运算符不能读取多个文件的输入,也不能把输出定向至多个文件
3、通常,文件名和运算符之间的空格不是必须的,除非偶尔在UNIX Shell、Linux Shell或Windoms命令行提示模式中使用的有特殊含义的字符。


http://chatgpt.dhexx.cn/article/Vqhjr5n4.shtml

相关文章

C语言_输出字符串和获取字符串

输出字符串和获取字符串 01——输出字符串 使用puts函数来输出字符串 使用printf函数来输出字符串 通过puts函数和printf函数都能够实现字符串输出 02——获取字符串 使用scanf函数来获取字符串 使用gets()函数来获取字符串. gets函数原型&#xff1a;char* gets(char *st…

c语言之printf函数输出字符数据

//用printf函数输出字符数据 #include <stdio.h> int main() {//定义两个变量char c a;int i 97;//输出变量%c以字符形式输出&#xff0c;%d以十进制整型形式输出printf("c%c,c%d\n", c, c);printf("i%c,i%d\n", i, i);return 0; } 运行结果&…

在C语言中怎样定义一个字符串并输入输出

在C语言中没有字符串类型&#xff0c;用字符数组处理字符串 字符数组定义&#xff1a;char 数组名 [常量表达式][常量表达式] 说明&#xff1a;一维字符数组&#xff0c;用于存储和处理一个字符串 。二维字符数组&#xff0c;用于同时存储和处理多个字符串 输入输出方法&…

用C语言输出一个字符串的所有子串

前言 啥是子串? 串中任意个连续字符组成的子序列称为该串的子串。 包含子串的串相应地称为主串。 ①空串是任意串的子串。 ②任意串是其自身的子串。 例&#xff1a;字符串"12"它的字串为"1",“2”,“12”,空串。共四个字串。 原理 懂了子串的概念我们…

C语言 字符数据输入输出

文章目录 C语言的标准库函数头文件 字符数据的输入输出putchar 函数&#xff08;单字符输出函数&#xff09;输出一个字符&#xff1a;输出控制字符输出转义字符 getchar 函数&#xff08;单字符输入函数&#xff09; 所谓数据的输入输出是从计算机角度出发的。 C语言本身没有…

c语言输出汉字字符串,c语言怎么输出字符串

C语言输出简单的字符串&#xff0c;例如个人信息的相关字符串&#xff0c;包括姓名、出生日期、号码。我们可以通过printf()函数直接打印输出指定信息字符串。 推荐教程&#xff1a;《C视频教程》 下面我们就通过简单的代码示例&#xff0c;给大家介绍c语言输出个人信息相关字符…

C语言程序——输出字符

为学日益&#xff0c;为道日损 文章目录 前言一、使用C语言一般格式显示字符二、编写代码2.运行结果 总结 前言 一个标准的C语言程序具有的一般格式&#xff1a; 预处理命令和全局性的声明 main() 主函数 { 局部变量声明 语句序列 } fun1()函数1 { 局部变量声明 语句序列 } fu…

C语言字符和字符串的输入与输出

C语言 一、输入单个字符 1、scanf函数输入单个字符 C语言scanf输入时缓冲区问题 scanf函数是标准输入流&#xff08;从键盘接收数据)&#xff0c;接收的数据放入输入缓冲区中&#xff0c;其中就包括在键盘输入的空格、回车这类字符&#xff0c;当你用%d接收时是不会影响的&a…

【C语言--字符数据的输入输出】

1、putchar函数–字符输出函数 功能是在显示器上输出单个字符。形式为&#xff1a;putchar(字符变量); 例如&#xff1a; putchar(A);//输出大写字母A putchat(x);//输出字符变量x的值2、getchar函数–键盘输入函数 功能是从键盘上输入一个字符。形式为&#xff1a;getchar(…

C语言打印输出字符串的几种方法

思路分析 知识点补充 1&#xff0c;在C语言中&#xff0c;一维数组的数组名实际上就是指向数组首项元素的指针。 2&#xff0c;如果指针p已经指向一个字符串&#xff0c;判断字符串是否结束&#xff0c;一般采用while(*p!\0)的办法。 以打印输出arr[30]"hello world&qu…

C语言——字符串、打印字符串的三种方式

文章目录 前言一、字符串1.字符串常量2.注意 scanf() 读取字符串例如&#xff0c;scanf() 输入中间有空格的字符串后观察打印情况 3.sizeof()函数计算字符串尺寸&#xff0c;strlen()函数计算字符串长度例子&#xff1a; 4.字符数组定义和初始化(1)传统的字符集合赋值&#xff…

C语言 格式输入输出与字符输入输出

提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、 格式输入输出 1、格式输出——printf函数 &#xff08;1&#xff09;格式 printf("格式控制"&#xff0c;输出列表项)&#xff1b; 格式控制分为格式声明&#xff08;%和格式字符&am…

jmeter+ant+jenkins-接口自动化持续集成(与之类似的postman+newman+Jenkins接口自动化持续集成)

jmeterantjenkins-接口自动化持续集成 jmeterantjenkins-接口自动化持续集成基本安装配置Ant配置Jmeter配置Jenkins&#xff0c;构建持续集成 jmeterantjenkins-接口自动化持续集成 Jmeter可以做接口测试&#xff0c;也能做压力测试&#xff0c;而且是开源软件 Ant是基于Java的…

MAC jmeter+ant 实现接口测试并将接口测试报告以邮件的形式发出-超详细

最近项目组涉及到接口测试&#xff0c;然后自己想着如何输出接口测试的报告&#xff0c;经过自己的了解&#xff0c;发现测试行业中每个公司每个测试人员输出的方式都不一样的。常规的有以下几种 使用表格的形式&#xff0c;手动去写&#xff0c;以总结的形式&#xff0c;给到…

jmeter+ant+jenkins接口自动化测试框架搭建

一个完整的接口测试框架需要支持接口的自动执行&#xff0c;自动生成测试报告&#xff0c;以及持续集成。Jmeter可以做接口测试&#xff1b;Ant是基于Java的构建工具&#xff0c;完成脚本执行并收集结果生成报告&#xff0c;可以跨平台&#xff1b;Jenkins是持续集成工具。将这…

windows下,jmeter+jenkins+ant接口自动化测试环境搭建

&#xff08;一&#xff09;jdk安装与配置 利用jmeter进行接口自动化&#xff0c;需要用到jdk&#xff0c;因此需要下载并安装jdk&#xff0c;下载jdk并配置好环境变量&#xff08;可参考网上教程&#xff09; &#xff08;二&#xff09;ant安装与配置 1.下载ant&#xff0…

Jmeter+Jenkins+Ant接口自动化测试平台搭建(Mac)输出测试报告(二)

1、首先将apache-jmeter-3.2extras下面的ant-jmeter-1.1.1的jar包复制到ant的lib目录下 复制到你安装ant目录下的lib文件里(这里就不贴图里) /usr/local/Cellar/ant/1.10.6/libexec/lib 提示&#xff1a;如果大家下载完ant后找不到路径&#xff0c;可以在终端输入命令&#x…

用JMeter+ANT进行接口自动化测试,并生成HTML测试报告

前言 小伙伴们&#xff0c;用python做接口自动化是不是写代码比较繁琐&#xff0c;而且没有python代码基础的小伙伴根本无从下手对吧&#xff01;今天我们来学习一下如何使用JMeter工具实现接口自动化测试。 安装 1、安装JDK&#xff0c;配置java环境变量&#xff08;安装过程…

jmeter——jmeter+ant生成优化的HTML接口自动化测试报告

jmeterant生成优化的HTML测试报告 一、最终实现效果展示二、实现方式1、环境搭建2、实现原理3、报告生成方式 三、实现步骤1、jar包转移&#xff1a;实现ant调用jmeter脚本2、jmeter插件包处理3、build文件的创建和修改4、报告展示信息调整5、html报告样式优化 四、遗留问题、 …

不会Python,用JMeter+ANT进行接口自动化测试,同样生成HTML测试报告,拿下20k轻轻松松

用python做接口自动化是不是写代码比较繁琐&#xff0c;而且没有python代码基础的小伙伴根本无从下手对吧&#xff01;今天我们来学习一下如何使用JMeter工具实现接口自动化测试。 一、安装 1、安装JDK&#xff0c;配置java环境变量&#xff08;安装过程略&#xff09; 2、安…