跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C 语言流水输入输出
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:C语言流水输入输出}} '''C语言流水输入输出'''是标准库中基于缓冲区的顺序读写机制,通过标准I/O函数(如<code>printf</code>/<code>scanf</code>)实现数据的高效流动。本文将系统讲解其原理、函数使用及实际应用。 == 核心概念 == 流水输入输出(Stream I/O)是C语言中处理数据的抽象模型,将输入/输出设备(如键盘、屏幕、文件)视为连续的'''数据流'''(Stream)。其特点包括: * '''缓冲机制''':减少直接访问硬件次数,提升效率 * '''顺序访问''':数据按写入/读取顺序处理 * '''设备无关性''':统一接口处理不同设备 === 流类型 === {| class="wikitable" |+ 标准流类型 ! 流 !! 文件指针 !! 默认设备 |- | 标准输入 || <code>stdin</code> || 键盘 |- | 标准输出 || <code>stdout</code> || 屏幕 |- | 标准错误 || <code>stderr</code> || 屏幕 |} == 基础函数 == === 格式化输出(printf) === <syntaxhighlight lang="c"> #include <stdio.h> int main() { int count = printf("PI: %.2f\n", 3.14159); // 格式化输出 printf("Printed %d characters\n", count); // 返回输出字符数 return 0; } </syntaxhighlight> 输出: <pre> PI: 3.14 Printed 8 characters </pre> === 格式化输入(scanf) === <syntaxhighlight lang="c"> #include <stdio.h> int main() { int age; printf("Enter your age: "); scanf("%d", &age); // 注意取地址符& printf("You are %d years old\n", age); return 0; } </syntaxhighlight> 交互示例: <pre> Enter your age: 25 You are 25 years old </pre> == 缓冲机制详解 == <mermaid> flowchart LR A[程序] -->|数据| B[缓冲区] B -->|满/刷新| C[设备] C -->|输入数据| B B -->|可用数据| A </mermaid> 缓冲类型: * '''全缓冲''':文件操作常用,缓冲区满时刷新 * '''行缓冲''':终端I/O常用,遇到换行符刷新 * '''无缓冲''':<code>stderr</code>默认使用 手动刷新缓冲区: <syntaxhighlight lang="c"> fflush(stdout); // 立即输出缓冲区内容 </syntaxhighlight> == 高级应用 == === 文件流操作 === <syntaxhighlight lang="c"> #include <stdio.h> int main() { FILE *fp = fopen("data.txt", "w+"); if(fp) { fprintf(fp, "Write to file\n"); // 文件格式化输出 rewind(fp); // 重置文件指针 char buffer[100]; fscanf(fp, "%s", buffer); // 文件格式化输入 printf("Read: %s\n", buffer); fclose(fp); } return 0; } </syntaxhighlight> === 错误处理模式 === <syntaxhighlight lang="c"> #include <stdio.h> #include <errno.h> int main() { FILE *fp = fopen("nonexistent.txt", "r"); if(fp == NULL) { perror("Error opening file"); // 自动附加错误描述 printf("Error code: %d\n", errno); } return 0; } </syntaxhighlight> 典型输出: <pre> Error opening file: No such file or directory Error code: 2 </pre> == 数学公式示例 == 当处理科学计算输出时,可能需要格式化数学公式: <math> printf("Euler's formula: e^{iπ} + 1 = %d\n", 0); </math> == 性能优化建议 == * 减少频繁小数据量I/O操作 * 对于大量数据,考虑使用块读写(<code>fread</code>/<code>fwrite</code>) * 错误检查应包含所有I/O操作返回值 == 常见问题 == {{Warning|1=使用<code>scanf</code>读取字符串时需指定长度防止缓冲区溢出}} <syntaxhighlight lang="c"> char name[20]; scanf("%19s", name); // 保留1字节给终止符 </syntaxhighlight> {{Note|1=混合使用<code>scanf</code>和<code>gets</code>可能导致输入混乱,建议统一使用<code>fgets</code>}} == 总结 == 流水I/O是C程序与外界交互的核心机制,理解其缓冲特性和正确使用错误处理方法是成为成熟C程序员的关键。通过本文的示例和解释,读者应能掌握: * 标准I/O函数的使用场景 * 缓冲区的运作原理 * 健壮I/O程序的编写方法 [[Category:编程语言]] [[Category:C]] [[Category:C 语言标准库]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Mbox
(
编辑
)
模板:Note
(
编辑
)
模板:Warning
(
编辑
)
模块:Arguments
(
编辑
)
模块:Message box
(
编辑
)
模块:Message box/ambox.css
(
编辑
)
模块:Message box/configuration
(
编辑
)
模块:Yesno
(
编辑
)