C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose(上):https://developer.aliyun.com/article/1513226
4. 文件的顺序读写
首先要了解什么是读写:我们写的程序是在内存中,而数据是要放到文件中的,文件又是在硬盘上的。当我们把文件里的数据读到内存中去时,这个动作我们称之为输入/读取。反过来,如果把程序中的东西放到硬盘上,这个动作我们称之为输出/写入。
顺序读写,顾名思义就是按照顺序在文件中读和写。
顺序读写函数表
4.IO流:高度抽象的概念
观察刚才的表格我们可以发现有的函数是适用于所有xx流的(比如 fputc 函数)。
fputc 就适用于所有输出流,也就是说它不仅仅可以给文件里写。我们来读一下MSDN的介绍:
那么 stdout 是什么呢?
stdout 就是标准输出流,在这里,要讲一下流的概念。
当写一个程序,但不同的程序我们可能想写到不同的地方
C语言默认打开的3个流:
① stdin - 标准输入流 - 键盘
② stdout - 标准输出流 - 屏幕
③ stderr - 标准输出流 - 屏幕
我们用流向屏幕上输出信息 sputc- stdout:
#include <stdio.h> int main() { fputc('a', stdout); fputc('b', stdout); fputc('c', stdout); return 0; }
运行结果:
fgetc 从标准输入流读取 - stdin
#include <stdio.h> // 使用fgetc从标准输入流中读 int main() { int ret = fgetc(stdin); printf("%c\n", ret); ret = fgetc(stdin); printf("%c\n", ret); ret = fgetc(stdin); printf("%c\n", ret); return 0; }
这里只读取三次(下面有这些函数和其他函数的介绍)
输入hello运行结果:
4.1字符输出函数 fputc
介绍:将参数 char 指定的字符写入到指定的流 stream 中,并把位置标识符向前移动
(字符必须为一个无符号字符)。适用于所有输出流。
代码演示:创建一个 test.txt,随后使用 fputc 函数分别写入 "abc" 到文件中
#include <stdio.h> int main() { FILE* pf = fopen("test.txt", "w"); if (pf == NULL) { perror("fopen"); return 1; } // fputc写文件 fputc('a', pf); fputc('b', pf); fputc('c', pf); // 关闭文件 fclose(pf); pf = NULL; return 0; }
运行后打开工程文件夹可以成功看到 test.txt 被创建了(大小为1kb可以看出写入成功了):
打开 test.txt发现abc被成功写进去了
测试下 w 的覆盖效果,把写的内容注释掉:
#include <stdio.h> int main() { FILE* pf = fopen("test.txt", "w"); if (pf == NULL) { perror("fopen"); return 1; } // fputc写文件 //fputc('a', pf); //fputc('b', pf); //fputc('c', pf); // 关闭文件 fclose(pf); pf = NULL; return 0; }
此时再次运行,我们发现那个文件里的内容不见了(大小也变为0kb):
值得注意的是,文件的写入是有顺序的。abc,先是a,然后是b,最后是c。
4.2字符输入函数 fgetc
介绍:从指定的流 stream 获取下一个字符,并把位置标识符向前移动(字符必须为一个无符号字符)。如果读取成功会返回相应的ASCII码值,如果读取失败它会返回一个EOF。适用于所有输入流。
码演示:在工程文件夹里打开 test.txt ,随便手动写入一些数据保存,随后使用 fgetc 函数读取:
#include <stdio.h> // 使用fgetc从文件里读 int main() { FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { perror("fopen"); return 1; } // 读文件 int ret = fgetc(pf); printf("%c\n", ret); ret = fgetc(pf); printf("%c\n", ret); ret = fgetc(pf); printf("%c\n", ret); // 关闭文件 fclose(pf); pf = NULL; return 0; }
运行结果如下:
注意:读取结束或者遇到错误时会返回EOF(值是-1)。
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose(下):https://developer.aliyun.com/article/1513238