就C程序而言,所有的I/O操作只是简单地从程序移入或移出字节的事情。这种字节流便称为流( stream )。
绝大多数流是完全缓存的,这意味着“读取”和“写入”实际上个是从一块被称为缓冲区的内存区域来回复制数据。
用于输出流的缓冲区只有当它写满时才会被刷新( flush ),写入到设备或文件中。一次性把写满的缓冲区写入和逐片把程序产生的输出分别写入相比效率更高。类似,输入缓冲区当它为空时通过设备或文件读取下一块较大的输入,重新填充缓冲区。

只有当操作系统可以断定它们与交互设备并无联系时才会进行完全缓冲。

每个流都有一个相应的FILE结构关联。

流分为文本流( text )和二进制流( binary ),对于每个ANSI C程序,运行时系统必须提供至少三个流

  • 标准输入( standard input,stdin,键盘 )
  • 标准输出( standard output,stdout,终端或屏幕 )
  • 标准错误( standard error,stderr )

打开流

FILE*
fopen( char const *name, char const *mode ); FILE*
freopen( char const *filename, char const *mode, FILE *stream );

mode字段的格式打开文件名为name的文件,执行成功返回一个指向FILE结构的指针,执行失败返回NULL

示例

	FILE *fp;
fp = fopen( "data3.txt", "r" );
if( fp == NULL ){
perror( "data3.txt" );
exit( EXIT_FAILURE );
}

其中perror是一个报告错误的函数,原型如下

void
perror( char const *message );

标准库函数在一个外部整型变量errno(在error.h中定义)中保存错误代码,当库函数失败时,errno才会被设置。当data3.txt不存在时,程序非正常退出,屏幕输出以下信息

data3.txt: No such file or directory
请按任意键继续. . .

freopen函数用于打开或重新打开一个特定的文件流,首先试图关闭这个流,然后再按照mode字段重新打开这个流

关闭流

int
fclose( FILE *f );

对于输出流,fclose函数在文件关闭之前刷新缓冲区,执行成功返回零值,失败返回EOF

标准流I/O

以三种基本形式处理数据

  • 单个字符
  • 文本行
  • 二进制数据

标准I/O常量

  • EOF
    提示达到文件尾
  • FOPEN_MAX
    一个程序能同时打开这么多的文件
  • FILENAME_MAX
    文件名的最大长度

字符I/O

getchar家族

int
fgetc( FILE *stream ); int
getc( FILE *stream ); int
getchar( void );
  • getchar始终从stdin读取

putchar家族

int
fputc( int character, FILE *stream ); int
putc( int character, FILE *stream ); int
putchar( int character );
  • putchar输出到stdout

撤销字符I/O

int
ungetc( int character, FILE *stream );

把先前读入的字符返回到流中

未格式化的文本行I/O

fgets和gets

char*
fgets( char *buffer, int buffer_size, FILE *stream ); char*
gets( char *buffer );
  • gets只能用于stdinfgets可以用于所有的输入流
  • fgets的第二个参数是缓冲区长度参数,它只读取输入的前buffer_size - 1 个字符;gets没有缓冲区长度参数,当输入的字符长度大于缓冲区最大长度时,多出来的字符将写入到后面的内存位置,破坏了其他不相关变量的值
  • fgets会读入结尾的回车,gets不会

fputs和puts

int
fputs( char const *buffer, FILE *stream ); int
puts( char const *buffer );
  • puts默认输出到stdoutfputs可以用于所有的输出流
  • puts会在输出末尾追加一个回车,fputs不追加

格式化的文本行I/O

scanf家族

int
fscanf( FILE *stream, char const *format, ... ); int
scanf( FILE *stream, char const *format, ... ); int
sscanf( char const *string, char const *format, ... );
  • 每个原型中的省略号表示 一个可变长度的指针列表,从输入转换而来的值按顺序逐个存储到对应的内存位置
  • fscanf从第一个参数给出的流读取,scanfstdin读取,sscanf从第一个参数给出的字符串中读取
  • 函数的返回值是被转换的输入值的个数,当文件到达尾部返回EOF

printf家族

int
fprintf( FILE *stream, char const *format, ... ); int
printf( FILE *stream, char const *format, ... ); int
sprintf( char *buffer, char const *format, ... );
  • fprintf输出到第一个参数给出的流,printf输出到stdoutsprintf输出到第一个参数给出的字符串中
  • sprintf没有指明缓冲区大小的参数,解决方法是在format字段限制输出的长度

二进制I/O

size_t
fread( void *buffer, size_t size, size_t count, FILE *stream ); size_t
fwrite( void *buffer, size_t size, size_t count, FILE *stream )

刷新和定位

int
fflush( FLIE *stream );

清空一个流的缓冲区,当streamstdin时可用于吃掉回车

long
ftell( FILE *stream ); int
fseek( FILE *stream, long offset, int from ); void
rewind( FILE *stream );
  • ftell返回流的当前位置
  • fseek在流中定位
from
SEEK_SET 起始位置起offset个位置,offset为非负数
SEEK_CUR 当前位置起offset个位置,offset可正可负
SEEK_END 尾部位置起offset个位置,offset可正可负,若为正值定位到文件尾后面
  • rewind函数将指针设置回起始位置,同时清除错误提示标志

C 输入输出函数的更多相关文章

  1. c语言的输入输出函数

    参考文章: http://blog.sina.com.cn/s/blog_784f40b80100psg9.html C语言输入输出函数分为两类: 1.格式化输入输出函数 2.非格式化输入输出 --- ...

  2. C语言中最常用的三种输入输出函数scanf()、printf()、getchar()和putchar()

    本文给大家介绍C语言中最常用的三种输入输出函数scanf().printf().getchar()和putchar(). 一.scanf()函数格式化输入函数scanf()的功能是从键盘上输入数据,该 ...

  3. C语言中输入输出函数

    1.1.1 格式化输入输出函数Turbo C2.0 标准库提供了两个控制台格式化输入. 输出函数printf() 和scanf(), 这两个函数可以在标准输入输出设备上以各种不同的格式读写数据.pri ...

  4. Linux C 程序 输入输出函数(THREE)

    标准输入输出函数#include<stdio.h>stdio 是 standard input & output 的缩写 字符数据输入输出函数: putchar() , getch ...

  5. c语言输入输出函数

    上学年学习c语言的时候比较匆忙,没好好吸收. 现在有时间好好复习下. 本文就c语言常见输入函数进行简单介绍,对比. ps:由于自己能力有限,时间有限,多数介绍,总结都是摘录网上相关学习资料,下面给出本 ...

  6. C字符串输入输出函数

    下面就几个常用的字符串输入输出函数做个小小的总结TAT 使用时添加头文件:#include<stdio.h>. scanf("格式控制字符串",变量地址列表):(pri ...

  7. C++中的字符串的输入输出函数、空字符与空格的区别、字符变量赋值和字符串初始化

      一.字符串输入输出函数 1.  cin.get()   逐个字符输入输出 2.  cin 可以将整个字符串一次性输入,但是,cin将空格.Tab和回车键,因此不能用于数组的一次性输入. 注意:ci ...

  8. C语言 · 字符串输入输出函数

    算法提高 3-2字符串输入输出函数   时间限制:1.0s   内存限制:512.0MB      描述 编写函数GetReal和GetString,在main函数中分别调用这两个函数.在读入一个实数 ...

  9. 【222】◀▶ IDL 输入输出函数说明

    参考:I/O - General Input/Output Routines —— 基本输入输出函数 01   PRINT/PRINTF 格式化输出. 02   READ/READF 格式化输入. 0 ...

  10. C语言学习<输入输出函数,函数的调用>

    #include <stdio.h> /* 输入输出函数的学习 函数的调用 2017.05.25 soulsjie */ //输入连个数字求最大值 void main(){ int Max ...

随机推荐

  1. HCNP Routing&Switching之OSPF LSA类型(二)

    前文我们了解了OSPF的一类.二类.三类LSA,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15209829.html:今天我们来聊一聊OSPF的四类和五类L ...

  2. linux centos7 df命令

    2021-08-04 1. df 命令简介 linux 中 df 命令的功能是用来检查 linux 服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信 ...

  3. HCNP Routing&Switching之OSPF外部路由类型以及forwarding address

    前文我们了解了OSPF的4类.5类LSA,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15222969.html:今天我们来聊一聊外部路由类型和forward ...

  4. vue 接入 vod-js-sdk-v6.js 完成视频上传

    东西有点多,耐心看完.按照操作一步一步来,绝对能成功 首先:npm 引入 npm install vod-js-sdk-v6 mian.js  全局引入  //腾讯云点播 import TcVod f ...

  5. 浅析 Dapr 里的云计算设计模式

    Dapr 实际上是把分布式系统 与微服务架构实践的挑战以及k8s 这三个主题的全方位的设计组合,特别是Kubernetes设计模式 一书作者Bilgin Ibryam 提出的Multi-Runtime ...

  6. 清除router路由后面的参数

    清除router参数: 1.this.$router.push({ query: {}}) 2.var path = this.$route.path; //获取路由路径    this.$route ...

  7. 对easyui-validatebox的验证类型的扩展--补充

    一.说明 这篇文章是<对easyui-validatebox的验证类型的扩展>的补充.在工程的持续开发中,我们又对此进行了更多的补充. 二.补充代码 增加了更多的验证类型. /* * 比较 ...

  8. 泛微OA E-cology(CNVD-2019-32204)远程命令执行漏洞复现分析

    漏洞复现 影响版本: E-cology 7.0 E-cology 8.0 E-cology 8.1 E-cology 9.0   直接在网站根目录后加入组件访问路径 /weaver/bsh.servl ...

  9. linux下分卷压缩,合并解压的3种方法

    我们上传东西的时候,由于文件过大而不能上传,或者不给上传,最明显的就是发邮件了,附件最大5M,有的10M.如果超过了就郁闷了.这个时候,如果能把压缩的东西,分割开来就比较爽了,windows下面我想大 ...

  10. 洛谷P1582——倒水(进制,数学)

    https://www.luogu.org/problem/show?pid=1582 题目描述 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了 ...