Linux:C/C++文件操作

回忆C语言文件操作

  1. fopen()的使用:
      答:打开文件流指针。
    param2 = “w”,当前没有文件就先创建,再写入。
    “r”,只读。
    “b”,可与w、b组合。
  • 只写的例子:
    请添加图片描述
    请添加图片描述
  • 只读的例子:
    依靠fgets(),还要借助buffer,最后还要判断文件是否有读出错,如果读出错,fgets也是0。
    请添加图片描述
    请添加图片描述
  • 追加的例子:param2:a
    请添加图片描述
    以a的形式追加,cat到txt内容更多。
    请添加图片描述
    如果mode=w,就会覆盖,把之前有的也删掉
  1. fputs():
      答:向特定文件写入。会打开默认的三个文件流。

  2. fgets():
      答:读取专用,需要借助缓冲区,在第二个参数上给size。
    如1中读文件的例子,给fgets(buffer, buffer_size, file_p)

  3. C语言文件操作fputs默认打开的输出流:
      答:fputs()会打开stdin、stdout、stderr。这三个流本质是FILE*。
    对应设备:
    stdin:键盘
    stdout:显示器
    stderr:显示器
    而C++会打开:cin、cout、cerr。

  4. 实验: 测试流stdout对应的是显示器
    观察如下代码,如果fputs默认打开三个文件流,那么stdout对应设备显示器应该打开了。所以给stdout写入msg,会在显示器上直接输出。
    请添加图片描述
    请添加图片描述
    至此,验证了通过stdout直接向显示器写入。
    总之,虽然编程语言可能会和和OS、驱动等交互,但是本质其实是想对硬件做出操作,所以语言上对“文件”的操作如函数:fopen、fclose、fread、fwritefputs、fgets等,都必须贯穿操作系统。
    请添加图片描述

C++文件操作

  • 写入实例:
    ofstream:std::ios::out没有文件,生成空文件。有则覆盖。
    请添加图片描述
      结果:
    请添加图片描述

WRONLY:写方式打开,O_CREAT:文件不存在,就创建。此外,0644是权限参数,如果不加,会导致权限混乱如下:
请添加图片描述

  1. 编写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。
请添加图片描述

  1. 运行后查看log权限。 正常了请添加图片描述
  • open()的返回值:有返回值。如下1输出3。3正常,-1是打开失败。
    请添加图片描述
    请添加图片描述

  • 承上,0、1、2去哪儿了?
      答:其实是0:标准输入(键盘),1:标准输出(显示器),2:标准错误(显示器)。
    请添加图片描述

  • 系统打开文件的本质:
      答:所有文件操作本质都是进程执行对应的函数、进程对文件操作、操作文件必须先打开文件。将文件相关属性信息加载到内存。一个进程可以打开多个文件。

  • 进程会打开很多文件,操作系统必须管理打开的文件,如何管理呢?
      答:先描述,再组织。这里有一个数据结构:file,保护了打开文件的相关属性、链接属性。

猜你喜欢

转载自blog.csdn.net/myscratch/article/details/127192223