IO 函数

C 语言标准库函数

函数声明 说明 注意 安全性
int getc(FILE *stream); getc 与 fgetc 几乎一致,区别在于 getc 为宏,fgetc 为函数,一般来说宏产生较大的代码,但是避免了函数调用的堆栈操作,所以速度会比较快,而宏展开可能对其参数有不止一次的调用,为了保险起见不能使用带有 side effects 的参数,由此可见使用 fgetc 比 getc 要安全。 side effects ⚠️
int getchar(void); 调用时如果 stdin 内有字符,则取出 stdin 中的第一个字符返回;否则阻塞等待用户输入,直到用户输入 '\n' 或者 ^D (EOF) 停止输入(flush),'\n' 会插入到 stdin 中,EOF 不会插入到 stdin 中,若此时 stdin 内有字符,则取出 stdin 中的第一个字符返回,否则返回 EOF (-1) 。相当于 getc(stdin)。 -
int fgetc(FILE *stream); 见 getc。 -
char *gets(char *s); 若 stdin 为空,等待用户输入,直到用户输入 '\n' 或 ^D (EOF) 停止输入(flush),<u>'\n' 会被换成空字符 '\0'</u>,stdin 的 str 和 '\0' 流入缓冲区 s,如果 strlen(str) 大于 sizeof(s) 会破坏程序堆栈导致程序崩溃,如果调用成功则返回缓冲区指针 s。Never use this function! 缓冲区溢出
char *fgets(char *s, int size, FILE *stream); 若 stdin 为空,等待用户输入,直到用户输入 '\n' 或 ^D (EOF) 停止输入(flush),'\n'会插入到 stdin 中,EOF 不会插入到 stdin 中,stdin 流入缓冲区 s 的字符数最多为 size-1 个,自动在第 size 个位置补上 '\0',共 size 个字符。如果 size > sizeof(s),当 stdin 含有足够多字符时会破坏程序堆栈导致程序崩溃。所以最好取值 size=sizeof(s),即等于缓冲区大小。fgets 比 gets 要安全。 size 不能大于缓冲区s大小 ⚠️
int putc(int c, FILE *stream); putc 与 fputc 几乎一致,区别在于 putc 为宏,fputc 为函数,一般来说宏产生较大的代码,但是避免了函数调用的堆栈操作,所以速度会比较快,而宏展开可能对其参数有不止一次的调用,为了保险起见不能使用带有 side effects 的参数,由此可见使用 fputc 比 putc 要安全。 side effects ⚠️
int putchar(int c); 相当于 putc(c, stdout)。 -
int fputc(int c, FILE *stream); 见 putc。 -
int puts(const char *s); 将字符串 s 写入到 stdout,<u>'\0' 会被换成 '\n'并写入</u>。 -
int fputs(const char *s, FILE *stream); 将字符串 s 写入到 stream。 -
int scanf(const char *format, ...); 从 stdin 格式化读取数据。 -
int fscanf(FILE *stream, const char *format, ...); 从 stream 格式化读取数据。 -
int sscanf(const char *str, const char *format, ...); 从字符串数组 str 格式化读取数据。 -
int printf(const char *format, ...); 格式化字符串输出到 stdout。 -
int fprintf(FILE *stream, const char *format, ...); 格式化字符串输出到 stream。 -
int sprintf(char *str, const char *format, ...); 格式化字符串复制到缓冲区 str(字符串数组)中,如果格式化字符串长度大于 sizeof(str) 即缓冲区大小,会破坏程序堆栈导致程序崩溃。 缓冲区溢出
int snprintf(char *str, size_t size, const char *format, ...); 与 sprintf 类似,但是可以指定 size 从格式化字符串最多取前 size-1 个字符加一个空字符 '\0' 复制到缓冲区 str。应取值 size = sizeof(str)。 size 不能大于缓冲区str的大小 ⚠️
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 从 stream 读取最多 nmemb 个(每个 size 字节大小)数据项存储到缓冲区 ptr 。如果缓冲区 ptr 不足够大,可能会发生缓冲区溢出。如果调用成功则返回读取到的数据项个数。 size 和 nmemb 的取值大小 ⚠️
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); 将缓冲区 ptr 中 nmemb 个 (每个 size 字节大小)数据项写入到 stream。如果调用成功则返回写入成功的数据项个数。 -

Linux 系统调用

函数声明 说明 注意 安全性
ssize_t read(int fd, void *buf, size_t count); 从文件 fd 中取最多 count 个字符存放在缓冲区 buf 中。该函数的返回值为读取到的字节数。如果 count > sizeof(buf) 可能发生缓冲区溢出。 cout 的取值大小 ⚠️
ssize_t write(int fd, const void *buf, size_t count); 将缓冲区 buf 中 count 个字节写入到文件 fd。 -

更新:
fgets: On linux Ctrl-D only works when the buffer is already empty otherwise it just flushes it. Therefore unless you have pressed enter without any characters after that, you will have to press Ctrl-D twice.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • C/C++输入输出流总结 前两天写C++实习作业,突然发现I/O是那么的陌生,打了好长时间的文件都没有打开,今天终...
    LuckTime阅读 1,729评论 0 6
  • 标准c++中string类函数介绍 注意不是CString 之所以抛弃char*的字符串而选用C++标准程序库中的...
    杰伦哎呦哎呦阅读 1,321评论 0 8
  • 数据的IO和复用 网络数据能够正常的到达用户,并被用户接受网络数据传输的目的。网络数据的接受以及发送有多种方案,例...
    VD2012阅读 1,459评论 0 0
  • 一月的最后一天。 一直在拖延,磨蹭,反反复复,曲曲折折。 一天蜿蜒的河,曲曲折折,没有尽头…… 我的画笔搁置了,推...
    听雷雷说阅读 174评论 0 0
  • 01 天行者卢克死了。 他们说,旧的那些都要过去,让新的篇章开始。可是,新的篇章里,还是被愤怒、孤独、绝望喂养了的...
    雪梨和雪柔阅读 478评论 0 0