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,保护了打开文件的相关属性、链接属性。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件嵌入资源文件后,可以使用相应的函数取资源文件中的数据。在Linux中,可以使用以下两种方式来取资源文件: 1. 使用C标准库函数 可以使用fopen、fread、fclose等C标准库函数来取资源文件。例如: ```cpp #include <stdio.h> int main() { // 打开资源文件 FILE *fp = fopen("/path/to/resource", "rb"); if (fp == NULL) { printf("Failed to open resource file\n"); return -1; } // 定位文件写位置 fseek(fp, 0, SEEK_SET); // 文件数据 char buffer[1024]; int count = fread(buffer, 1, sizeof(buffer), fp); if (count < 0) { printf("Failed to read resource file\n"); return -1; } // 输出取的数据 printf("Read %d bytes from resource file:\n", count); printf("%s\n", buffer); // 关闭资源文件 fclose(fp); return 0; } ``` 2. 使用系统调用函数 可以使用open、read、close等系统调用函数来取资源文件。例如: ```cpp #include <iostream> #include <fcntl.h> #include <unistd.h> using namespace std; int main() { // 打开资源文件 int fd = open("/path/to/resource", O_RDONLY); if (fd == -1) { cout << "Failed to open resource file" << endl; return -1; } // 定位文件写位置 lseek(fd, 0, SEEK_SET); // 文件数据 char buffer[1024]; int count = read(fd, buffer, sizeof(buffer)); if (count < 0) { cout << "Failed to read resource file" << endl; return -1; } // 输出取的数据 cout << "Read " << count << " bytes from resource file:" << endl; cout << buffer << endl; // 关闭资源文件 close(fd); return 0; } ``` 需要注意的是,取资源文件时需要使用正确的路径和文件名。另外,在使用系统调用函数时需要注意文件的权限问题,对于某些系统级别的资源文件,可能需要具有管理员权限才能访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值