58同城佛山网站建设,计算机网站开发与技术专业介绍,怎么做单向网站链接,张家港苏州网站建设目录
八.系统文件IO 8.1 前言 8.2 C语言文件IO
C语言常用的基本函数
C语言默认打开的的三个流 8.3 系统文件IO
open接口
close接口
write接口
read接口 8.4 C语言文件IO与系统文件IO的关系 八.系统文件IO 8.1 前言
系统文件 I/O#xff08;输入/输出#xff09;是指在…目录
八.系统文件IO 8.1 前言 8.2 C语言文件IO
C语言常用的基本函数
C语言默认打开的的三个流 8.3 系统文件IO
open接口
close接口
write接口
read接口 8.4 C语言文件IO与系统文件IO的关系 八.系统文件IO 8.1 前言
系统文件 I/O输入/输出是指在计算机系统中通过操作系统提供的接口和函数实现应用程序与文件系统之间的数据交互操作.这种交互涉及到从外部存储设备通常是硬盘读取数据到内存中或将内存中的数据写入到外部存储设备中.
这里我们结合最初的知识从整体上认识系统文件IO
【Linux学习】初识进程 | 进程概念-CSDN博客 顾名思义,这次我们讲到的系统文件IO正是处于操作系统层面的工作. 8.2 C语言文件IO
C语言常用的基本函数
在学习C语言时我们便已经接触过许多语言层面上的IO函数
1.open 打开文件 FILE *fopen(const char *filename, const char *mode); filename文件路径 mode打开文件的模式例如 r读取、w写入、a追加等 2.fclose 关闭文件 int fclose(FILE *stream); stream指向 FILE 结构的指针表示要关闭的文件 3.fprintf 向文件写入格式化数据 int fprintf(FILE *stream, const char *format, ...); stream指向 FILE 结构的指针表示要写入的文件 format格式化字符串类似于 printf 中的格式化字符串 4.fscanf 从文件读取格式化数据 int fscanf(FILE *stream, const char *format, ...); stream指向 FILE 结构的指针表示要读取的文件 format格式化字符串指定了要读取的数据的格式 5.fputc 写入一个字符到文件 int fputc(int character, FILE *stream); character要写入的字符 stream指向 FILE 结构的指针表示要写入的文件 6.fgetc 从文件读取一个字符 int fgetc(FILE *stream); stream指向 FILE 结构的指针表示要读取的文件 7.fwrite 向文件写入一块数据 size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream); ptr指向要写入的数据的指针 size每个数据项的大小以字节为单位 count要写入的数据项的数量 stream指向 FILE 结构的指针表示要写入的文件 8.fread 从文件读取一块数据 size_t fread(void *ptr, size_t size, size_t count, FILE *stream); ptr指向存储读取数据的缓冲区的指针 size每个数据项的大小以字节为单位 count要读取的数据项的数量。 stream指向 FILE 结构的指针表示要读取的文件 9.feof 检查文件结束标志 int feof(FILE *stream); stream指向 FILE 结构的指针表示要检查的文件 10.rewind 将文件位置指针重置到文件开头 void rewind(FILE *stream); stream指向 FILE 结构的指针表示要重置的文件 这些函数是 C 语言中进行文件 I/O 操作的基本函数,通过它们你可以打开、读取、写入和关闭文件实现对文件的各种操作
C语言默认打开的的三个流
在 C 语言中有三个默认打开的标准 I/O 流它们是 标准输入流 (stdin) 文件描述符0默认与键盘关联用于从用户获取输入 标准输出流 (stdout) 文件描述符1默认与屏幕关联用于向用户输出数据 标准错误流 (stderr) 文件描述符2默认与屏幕关联用于输出错误消息 这里我们可以在Linux下使用man手册查找 这里我们可以发现三个流的数据类型都是FILE*类型.同时也体现出了Linux系统一切皆文件的设计哲学.
既然是当作文件,那么我们就用上面提到的C语言提供的 fprintf函数来进行测试
#include stdio.h
int main() { // 使用标准输入输出消息fprintf(stdin, This is an in message.\n);// 使用标准输出输出消息fprintf(stdout, This is an out message.\n);// 使用标准错误输出消息fprintf(stderr, This is an error message.\n);return 0;
}这里我们成功通过 fprintf() 向显示器输出了两条信息,进一步验证了stderr与stdout默认与显示器相关 而stdin默认与键盘相关. 8.3 系统文件IO
open接口
用于打开或创建文件的系统调用通常用于在程序中获取文件描述符以便后续进行文件 I/O 操作
这里通过man手册查看其函数原型 参数:
1.pathname: 要打开或创建的目标文件 若pathname以路径的方式给出则需要创建该文件时在pathname路径下进行创建若pathname以文件名的方式给出则需要创建该文件时默认在当前路径下进行创建 2.flags: 表示打开文件的标志 O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读写打开 这三个常量必须指定一个且只能指定一个O_CREAT : 若文件不存在则创建它。需要使用mode选项来指明新文件的访问权限O_APPEND: 追加写O_TRUNC如果文件存在截断文件为零长度 打开文件时可以传入多个参数选项当有多个选项传入时将这些选项用“或”运算符隔开 例如若想以只写的方式打开文件但当目标文件不存在时自动创建文件则参数设置如下 O_WRONLY | O_CREAT 这里主要是用到了位图的思想
传入的flags类型为整数,也就是有32个bit位
而每个bit位的状态只会是0或1,这时我们可以使用一个bit位来对应一种参数是否传入,也就是定义为如果某一bit位为1,则对应参数被传入
实际上传入flags的每一个选项在系统当中都是以宏的方式进行定义的 这里这些宏的值是八进制数在文件访问标志中通常使用八进制数表示.
这些宏定义选项的共同点就是它们的二进制序列当中有且只有一个比特位是1(O_RDONLY选项的二进制序列为全0表示O_RDONLY选项为默认选项)且为1的比特位是各不相同的这样一来在open函数内部就可以通过使用“与”运算来判断是否设置了某一选项。
int open(arg1, arg2, arg3){if (arg2O_RDONLY){//设置了O_RDONLY选项}if (arg2O_WRONLY){//设置了O_WRONLY选项}if (arg2O_RDWR){//设置了O_RDWR选项}if (arg2O_CREAT){//设置了O_CREAT选项}//...
}3.mode: 表示创建文件的默认权限
返回值: 成功新打开的文件描述符(相关概念会在后面讲到)失败-1 close接口
用于关闭一个打开的文件描述符,这个函数通常用于释放程序中不再需要的文件资源 参数: fd:要关闭的文件描述符 返回值 如果成功返回 0。如果发生错误返回 -1 write接口
用于向文件描述符通常是文件写入数据 参数: fd文件描述符表示要写入的源文件或设备buf指向要写入数据的缓冲区的指针count要写入的字节数 返回值 如果写入成功返回 写入的字节数如果发生错误返回 -1 read接口
用于从文件描述符通常是文件读取数据 参数: fd文件描述符表示要读取的源文件或设备buf指向存储读取数据的缓冲区的指针count要读取的字节数 返回值 返回值为读取的字节数如果已到达文件尾EOF则返回 0 表示没有更多数据可读如果出现错误返回值为 -1 8.4 C语言文件IO与系统文件IO的关系
在 C 语言中文件 I/OInput/Output操作通常是通过标准库提供的函数来进行的主要包括对文件的读取和写入。这些函数包括 fopen、fclose、fread、fwrite、fseek 等
与此不同系统文件 I/O 操作是通过操作系统提供的系统调用来执行的。在 UNIX/Linux 等系统中常见的系统调用包括 open、read、write、close 等。这些系统调用直接与操作系统内核进行交互提供了更底层的文件操作能力
C 语言标准库的文件 I/O 函数实际上是建立在系统文件 I/O 操作的基础上的。例如fopen 函数在底层可能会使用 open 系统调用来打开文件fwrite 可能会使用 write 系统调用来写入数据
C 语言标准库的文件 I/O 函数提供了一层抽象使得文件操作更加方便和可移植。通过使用标准库程序员可以更容易地编写跨平台的代码而不必过多考虑底层的系统差异。此外标准库函数通常提供了更多的错误处理和缓冲机制以提高性能
总的来说C 语言标准库的文件 I/O 函数是建立在系统文件 I/O 操作之上的高级接口提供了更便捷、抽象的文件操作方式同时隐藏了底层系统调用的复杂性。在许多情况下使用标准库函数足以满足文件操作的需求但在某些特殊情况下直接使用系统调用可能更为灵活和高效