回忆C语言文件操作
- fopen()的使用:
答:打开文件流指针。
param2 = “w”,当前没有文件就先创建,再写入。
“r”,只读。
“b”,可与w、b组合。
- 只写的例子:
- 只读的例子:
依靠fgets(),还要借助buffer,最后还要判断文件是否有读出错,如果读出错,fgets也是0。
- 追加的例子:param2:a
以a的形式追加,cat到txt内容更多。
如果mode=w,就会覆盖,把之前有的也删掉。
-
fputs():
答:向特定文件写入。会打开默认的三个文件流。 -
fgets():
答:读取专用,需要借助缓冲区,在第二个参数上给size。
如1中读文件的例子,给fgets(buffer, buffer_size, file_p) -
C语言文件操作fputs默认打开的输出流:
答:fputs()会打开stdin、stdout、stderr。这三个流本质是FILE*。
对应设备:
stdin:键盘
stdout:显示器
stderr:显示器
而C++会打开:cin、cout、cerr。 -
实验: 测试流stdout对应的是显示器
观察如下代码,如果fputs默认打开三个文件流,那么stdout对应设备显示器应该打开了。所以给stdout写入msg,会在显示器上直接输出。
至此,验证了通过stdout直接向显示器写入。
总之,虽然编程语言可能会和和OS、驱动等交互,但是本质其实是想对硬件做出操作,所以语言上对“文件”的操作如函数:fopen、fclose、fread、fwritefputs、fgets等,都必须贯穿操作系统。
C++文件操作
- 写入实例:
ofstream:std::ios::out没有文件,生成空文件。有则覆盖。
结果:
WRONLY:写方式打开,O_CREAT:文件不存在,就创建。此外,0644是权限参数,如果不加,会导致权限混乱如下:
- 编写C语言文件。
- 关于open():
param2:flags是标志位。有32位,如上第二行,有两个标志位。可以用|方式传递多个。你传入参后,底层会做&操作。如上的O_WRONLY、O_CREAT都是只有一个比特位是1的数据,且不重复。
每个值转为二进制都只有一个bit位是1。所以两个值或一下,让两个位置是11,所以和传入参做&,就可以得到真实想要的值。 - 一条装杯的可查看系统源文件中这些标志值真实大小的命令:
grep -ER 'O_CREATE|O_RDONLY' /usr/include/
grep -E是过滤寻找,R是递归查找。
接下来去如上图中的/usr/include/asm-generic/fcntl.h
然后通过vim 编辑这个文件,再在命令行上:./RDONLY查看发现了是全0和全1。
- 运行后查看log权限。 正常了
-
open()的返回值:有返回值。如下1输出3。3正常,-1是打开失败。
-
承上,0、1、2去哪儿了?
答:其实是0:标准输入(键盘),1:标准输出(显示器),2:标准错误(显示器)。
-
系统打开文件的本质:
答:所有文件操作本质都是进程执行对应的函数、进程对文件操作、操作文件必须先打开文件。将文件相关属性信息加载到内存。一个进程可以打开多个文件。 -
进程会打开很多文件,操作系统必须管理打开的文件,如何管理呢?
答:先描述,再组织。这里有一个数据结构:file,保护了打开文件的相关属性、链接属性。