26.输入与输出

news/2025/4/1 4:38:27/文章来源:https://www.cnblogs.com/littlecc/p/18799582

当我们提到输入时,这意味着要向程序填充一些数据。输入可以是以文件的形式或从命令行中进行。C 语言提供了一系列内置的函数来读取给定的输入,并根据需要填充到程序中。

当我们提到输出时,这意味着要在屏幕上、打印机上或任意文件中显示一些数据。C 语言提供了一系列内置的函数来输出数据到计算机屏幕上和保存数据到文本文件或二进制文件中。

  • 1.标准文件

C 语言把所有的设备都当作文件。所以设备(比如显示器)被处理的方式与文件相同。
以下三个文件会在程序执行时自动打开,以便访问键盘和屏幕。

标准文件 文件指针 设备
标准输入 stdin 键盘
标准输出 stdout 屏幕
标准错误 stderr 您的屏幕

C 语言中的 I/O (输入/输出) 通常使用 printf() 和 scanf() 两个函数。
scanf() 函数用于从标准输入(键盘)读取并格式化
printf() 函数发送格式化输出到标准输出(屏幕)。

  • printf() 函数

printf() 函数用于将格式化的数据输出到标准输出设备(通常是屏幕)。

#include <stdio.h>      // 执行 printf() 函数需要该库
int main()
{printf("菜鸟教程");  //显示引号中的内容return 0;
}
  • scanf() 函数

scanf() 函数用于从标准输入设备(通常是键盘)读取格式化的输入。

#include <stdio.h>int main() {int a;float b;printf("Enter an integer and a float: ");scanf("%d %f", &a, &b);printf("You entered: %d and %.2f\n", a, b);return 0;
}
  • 单个字符输入输出
    • getchar()

    int getchar(void) 函数从屏幕读取下一个可用的字符,并把它返回为一个整数。这个函数在同一个时间内只会读取一个单一的字符。您可以在循环内使用这个方法,以便从屏幕上读取多个字符。

    • putchar() 函数

    int putchar(int c) 函数把字符输出到屏幕上,并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。您可以在循环内使用这个方法,以便在屏幕上输出多个字符。

#include <stdio.h>int main()
{int c;printf("Enter a value:");c = getchar();  //获取单个字符printf("\nYou entered: ");putchar(c);  //输出单个字符return 0;
}
  • 字符串输入输出

    • gets()和fgets():

    gets() 函数用于从标准输入设备读取一行字符串,但不推荐使用,因为它容易导致缓冲区溢出,推荐使用 fgets() 函数。

    char *fgets(char *str, int n, FILE *stream);
    
    • str:指向字符数组的指针,用于存储读取的字符串。
    • n:要读取的最大字符数(包括空字符\0)。
    • stream:文件流,通常使用stdin表示标准输入。
    #include <stdio.h>int main() {char str[100];printf("Enter a string: ");fgets(str, sizeof(str), stdin);printf("You entered: %s", str);return 0;
    }
    
    • puts() 函数

    puts() 函数用于将一个字符串输出到标准输出设备,并自动在末尾添加换行符。
    语法:

     int puts(const char *str);
    
    • str:要输出的字符串。
    • 成功时返回非负值,失败时返回EOF。
     #include <stdio.h>int main() {char str[] = "Hello, World!";puts(str);return 0;
    }
    
    • fputs() 函数

    fputs() 函数用于将字符串输出到指定的流(如标准输出、文件等),但不会自动在字符串末尾添加换行符。

    int fputs(const char *str, FILE *stream);
    
    • str:要输出的字符串(以空字符 \0 结尾的字符数组)。
    • stream:指定输出的流,可以是标准输出(stdout)、文件流等。
    • 成功时返回一个非负值(通常是输出的字符数)。
    • 失败时返回 EOF。
  • 特点:

不添加换行符:fputs() 不会在输出字符串后自动添加换行符。
灵活的输出流:fputs() 可以输出到任意流,如标准输出、文件等。

#include <stdio.h>int main() {char str[] = "Hello, World!";fputs(str, stdout);  // 输出 "Hello, World!",不换行return 0;
}
  • puts() 和 fputs() 的区别
特性 puts() fputs()
换行符 自动在字符串末尾添加换行符 不添加换行符
输出流 只能输出到标准输出(屏幕) 可以输出到任意流(如文件、屏幕)
参数 只需要一个字符串参数 需要字符串参数和流参数
返回值 成功时返回非负值,失败时返回 EOF 成功时返回非负值,失败时返回 EOF


  • 文件输入与输出

C 语言还提供了文件输入输出的功能,允许从文件中读取数据或向文件中写入数据

  • fopen()函数

用于打开一个文件

FILE *fopen(const char *filename, const char *mode);
  • 参数:

    • filename:要打开的文件名。
    • mode:打开文件的模式,如"r"(只读)、"w"(只写)、"a"(追加)等。
  • 返回值:

    • 成功时返回指向FILE对象的指针,失败时返回NULL。
  • fclose() 函数

用于关闭一个打开的文件

int fclose(FILE *stream);
  • 参数:

    • stream:指向FILE对象的指针。
  • 返回值:

    • 成功时返回0,失败时返回EOF。

+ fprintf(文件名, "Hello, world!\n");  // 写入文件
+ fscanf(文件名, "%s", buffer); //读取数据赋值给buffer、fscanf的%s只会读取第一个单词#include <stdio.h>int main()
{FILE *file;    // 是一个文件指针的声明语句file = fopen("example.txt", "w");   //可写模式打开文件if(file != NULL){fprintf(file, "Hello World!\n");  //写入文件fclose(file);  //关闭文件}char buffer[100];file = fopen("example.txt", "r"); // 打开文件用于读取if(file != NULL){fscanf(file, "%s", buffer); //读取数据printf("Read form file: %s\n", buffer);fclose(file);}return 0;
}
  • 问题1:读取不完整
    现象:fscanf的%s只会读取第一个单词
    改进:使用fgets读取整行
fgets(buffer, sizeof(buffer), file);
  • 问题2:缓冲区溢出风险
    现象:文件内容超过99字符(需留1字节给\0)会导致溢出
    改进:限制读取长度
fscanf(file, "%99s", buffer); // 最多读取99字符
  • 代码改进
#include <stdio.h>
#include <string.h>int main() {FILE *file;  // 是一个文件指针的声明语句// 写入文件(修正拼写错误)file = fopen("example.txt", "w");if(file != NULL) {fprintf(file, "Hello World!\n");fclose(file);}// 读取文件(安全方式)char buffer[100];file = fopen("example.txt", "r");if(file != NULL) {fgets(buffer, sizeof(buffer), file); // 读取整行buffer[strcspn(buffer, "\n")] = '\0'; // 去除换行符printf("Read from file: %s\n", buffer);fclose(file);} else {printf("Failed to open file!\n");}return 0;
}
  • 关键知识点总结

  • 文件打开模式:

    • "w":写入(覆盖)
    • "a":追加
    • "r":读取
    • "w+":读写(覆盖)
  • 文件操作三步骤:

FILE *f = fopen(); // 1. 打开
/* 操作文件 */     // 2. 读写
fclose(f);         // 3. 关闭
  • 常用函数对比:
函数 用途 特点
fprintf 格式化写入文件 类似printf
fscanf 格式化读取 容易溢出,需限制长度
fgets 安全读取一行 推荐使用
fputs 写入字符串 不自动添加换行符

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/907670.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang学习Ⅱ

iota,函数多返回值,init函数,import导包 常量定义方式:const a int = 10; const{ a=10 b=20 }1 const{ 2 BeiJing = iota*10 //iota为0 3 ShangHai 4 NanJing 5 } //使用const定义枚举,BeiJing为0,ShangHai为10,NanJing为20View Code

SpringBoot整合RabbitMQ--Direct和Topic模式

一.Direct模式 这几个模式使用SpringBoot的整合和前面使用源生Java整合其实是差不多的,故而步骤就不再详细赘述了,直接先导入依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId&g…

CMS和G1的区别

悲观者从机会中看到困难。乐观者从困难中看到机会。 ——温斯顿丘吉尔区别一:使用的范围不一样:CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用。 G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用区别二:STW的时间:CMS收集器以最小的停…

nfls 游记。

省流:三场模拟赛。rk1(2) rk3 rk4Day 1 3.26: 在前面的博客里面。 下午补了 noip2024 T1 。我怎么还是不会写????? Day 2 3.27: 没有模拟赛。组合数学专题。 写了一堆数学题。 中午逃离校园去吃了饭,终于有饭吃了!!!!111 晚上打了一场比赛,后三题全拼的暴力 /q…

PHP2 攻防世界

这题进去之后看到的:介绍该网站?gs,用f12,ctrl+u看都没看出啥。 看了别的博客才知道要看index.phps。第一次知道还有index.phps这个文件好像是扫描index.php的源代码啥的。操蛋 然后就看index.phps里的代码吧:这里看代码, `<?php if("admin"===$_GET[id]) {…

垃圾回收算法哪些阶段会STW

悲观者从机会中看到困难。乐观者从困难中看到机会。 ——温斯顿丘吉尔标记-复制算法应用在CMS新生代(ParNew是CMS默认的新生代垃圾回收器)和G1垃圾回收器中。标记复制算法可以分为三个阶段:标记阶段,即从GC Roots集合开始,标记活跃对象; 转移阶段,即把活跃对象复制到新的内存…

【unity】学习制作2D横板冒险游戏-4-

敌人的基本逻辑和动画 创建文件如图所示c#文件继承父类Enemy给boar挂载代码在敌人脚本中定义基本的变量并实例化面朝方向 在游戏中我们可以看到野猪的默认方向为左边 此时的transform.localscale的值为1我们希望当野猪面向右边时facedir的值为1,以此来判断敌人的面朝方向野猪的…

判断垃圾的方法

悲观者从机会中看到困难。乐观者从困难中看到机会。 ——温斯顿丘吉尔在Java中,判断对象是否为垃圾(即不再被使用,可以被垃圾回收器回收)主要依据两种主流的垃圾回收算法来实现:引用计数法和可达性分析算法。 引用计数法(Reference Counting)原理:为每个对象分配一个引用计数…

mRNA,IncRNA,miRNA

mRNA、lncRNA 和 miRNA 的核心区别 三者均为 RNA 分子,但在结构、功能和生物学作用上有显著差异: 1. mRNA(信使RNA)功能 :将 DNA 的遗传信息转录后传递至核糖体,指导蛋白质合成(基因表达的核心步骤)。结构 :单链线性结构,长度通常为数百至数千个核苷酸(nt)。 包含编码…

Training-WWW-Robots 攻防世界

进入网站看到根据提示可知:robots.txt 是关键点 进去看到:看到关键路径:进入看到flag

python第三章课后练习题

3.19 import time date_str = time.strftime("%Y年%m月%d日",time.localtime()) print("当前日期:",date_str)3.20 import time current_time = time.localtime() format1 = time.strftime("%Y年%m月%d日",current_time) print("格式1:&q…

[DevOps] 使用 Windows Sysprep(系统准备)重置计算机 SID

关于 Sysprep(系统准备) https://learn.microsoft.com/zh-cn/windows-hardware/manufacture/desktop/sysprep--system-preparation--overview?view=windows-11 Sysprep 是 Windows 映像的一部分,在审核模式下运行。Sysprep(系统准备)可以准备 Windows 客户端或 Windows S…