IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C/C++ 基础文件操作 -> 正文阅读

[C++知识库]C/C++ 基础文件操作

目录

1、文件分类

2、文件的打开与关闭

3、顺序读写文件

4、随机读写文件

5、其他与文件相关的操作


本文的文件操作是 ANSI C 标准的,在 C/C++ 中都可以使用。

1、文件分类

从数据的组织形式来说,数据文件可以分为 ASCII 文件二进制文件数据在内存(RAM)中是以二进制形式存储的,如果不加处理地输出到外存(ROM)进行文件保存的话,该保存在 ROM 中的文件就是二进制文件。如果要求在 ROM 中以 ASCII 码形式保存的话则需要在存储前进行转换,ASCII 文件又称做文本文件。

就比如内存中有一个 float 类型的浮点数 3.14259 ,如果以二进制形式输出至外存进行存储的话,所占的内存就是 float 固有的?4?个字节的大小。如果以文本格式进行存储的话,则需要将?3.14259 的每一位数字转换成字符类型(ASCII码)进行存储,这时由于有 7 个字符,因此就需要?7?个字节的空间存储。

2、文件的打开与关闭

文件的打开与关闭函数分别为 fopen()fclose(),其具体的使用如下:

#include <stdio.h>
FILE *fp;   // 声明文件指针(句柄)
fp = fopen(文件名, 使用文件方式);  // 打开文件
fclose(fp);  // 关闭文件

其中,FILE 为文件类型结构体,定义在 stdio.h 头文件中,用来存放文件名、文件状态、当前位置等信息。一般定义一个 FILE 类型的文件指针,通过指针引用这些 FILE 类型变量更加方便。

fopen 函数的第一个参数是的文件名(字符串类型),是使用绝对路径还是相对路径视实际情况而定,该函数返回一个指向该文件信息区起始地址的指针。第二个参数代表文件的打开方式,是字符串类型的参数,有关该参数的列表如下:

文件使用方式

含义

如果指定的文件不存在

“r”read只读)

为了输入数据,打开已存在的文本文件

报错

“w”write只写)

为了输出数据,打开文本文件

建立新文件

“a”append追加)

文本文件末尾添加数据

报错

rbbinary只读)

为了输入数据,打开已存在二进制文件

报错

wbbinary只写)

为了输出数据,打开二进制文件

建立新文件

“ab”binary追加)

二进制文件末尾添加数据

报错

“r+” / "rw"读写

为了读写数据,打开已存在的文本文件

报错

“w+” / "wr"(读写

为了读写数据,建立新的文本文件

建立新文件

“a+” / "ar"(读写

为了读写数据,打开已存在的文本文件

报错

rb+”读写

为了读写数据,打开已存在的二进制文件

报错

wb+”读写

为了读写数据,建立新的二进制文件

建立新文件

ab+”读写

为了读写数据,打开二进制文件

报错

fclose 函数的参数为文件指针。该函数用来关闭文件,即撤销文件指针。若果成功执行了关闭操作则返回0,否则返回 EOF(01)。

3、顺序读写文件

顺序读写文件就是从文件的开头开始按顺序进行遍历读写操作,也即按照文件数据的物理存放顺序进行读写。有关库函数的使用列表如下:

函数名

调用方式

功能

返回值

fgetc

fgetc(fp)

fp 指向的文件中读入一个字符

返回所读的字符,若失败则返回 EOF

fputc

fputc(ch, fp)

fp 指向的文件中写入一个字符

返回所写的字符,若失败则返回 EOF

fgets

fgets(str, n, fp)

fp 指向的文件中读入一个长度为 (n-1) 字符串存放到字符数组 str

读成功返回地址 str?,否则返回 NULL

fputs

fputs(str, fp)

str 所指向的字符串写到文件指针 fp 所指的文件中

写成功返回 0,否则返回非 0

函数名中 c 表示字符 character,s 表示字符串 string

系统使用文件读写位置标记来表示当前的访问位置,开始时指向第一个字节,每进行一次读写操作,就自动按顺序移向下一个要读写的位置。程序中可以使用 feof(fp) 函数来判断 文件读写位置标记?是否移到文件末尾,即磁盘文件是否结束,如果是则返回1,否则返回0,一般用于读文件。

注意 putchar() 与 getchar() 函数为从终端对内存变量进行读写操作的函数。

fgets 与 fputs 的函数原型为:

char* fgets(char* str, int n, FILE *fp)
char* fputs(char* str, FILE *fp)

使用格式化方式读写文件

函数调用如下:

fprintf(文件指针, 格式字符串, 输出列表);
fscanf(文件指针, 格式字符串, 输出列表);

这两个函数使用方式与 printf 和 scanf 差不多,只是后者的输入输出都是在终端中进行的,前者是在文件中进行的。如下例子

// 向文件中写入两个数据,最种在文本文件中呈现为: 1, 3.14
fprintf(fp, "%d,%5.2f", i, f);
// 如果磁盘文件上有字符: 1, 3.14 以下操作从此盘中读取这两个数字存入相应的变量中
fscanf(fp, "%d,%f", i, f);

?由前述文件分类可知,格式化读写文件涉及数据的 二进制 与 ASCII 格式的转换,因此在频繁进行磁盘文件操作的场合效率较低,在这种场景下我们可以进行二进制的读写。

使用二进制方式读写文件

fread(buffer, size, count, fp);
fwrite(buffer, size, count, fp);

使用 fread 函数在进行读操作时直接从文件中读取一个原始的二进制数据块,在使用 fwrite 函数进行写数据操作时也是直接向文件中写入原始未经转换的二进制数据。另外需要注意的是,使用这两个函数的前提是在打开文件时要以二进制方式打开

四个参数中:

  • buffer 是一个地址,对?fread 函数来说就是从文件中读入数据的存储区的地址,对 fwrite 来说就是把此地址开始的数据写入文件。
  • size 是要读/写的数据项(数据项可以是单个数据类型,比如 char、int、float 等,也可以是一个结构体等数据块)的字节数
  • count 是要读/写多少个数据项
  • fp 是要读/写的 FILE 类型文件指针

4、随机读写文件

一般在使用文件数据时,很少从文件开头进行数据遍历读写的,这样效率太低。我们大多数时候需要从文件中间某个地方的数据进行读取,在跳到另外一个地方进行操作,显然前述的顺序读写操作不适合这种场景,这时就需要对文件的随机读写操作,随机在这里也就是任意位置的意思。

对文件进行随机读写的原理就是对前面提到的?文件读写位置标记?进行自定义的定位,来达到自定义文件读写位置的效果。

  • 使用 rewind(fp) 函数可以将文件位置标记指向文件开头。
  • 使用 fseek() 函数改变文件的位置标记,其调用形式为:
fseek(文件类型指针, 位移量, 起始点)

第三个参数 起始点 具有三个固定的枚举参数值:

  • SEEK_SET :代表文件开始位置,也可用数字 0 代替
  • SEEK_CUR:代表文件开始位置,也可用数字 1 代替
  • SEEK_END:代表文件末尾位置,也可用数字 2 代替

位移量 就是以 起始点 为基点移动的字节数,为正就是向前移动,为负就是向后移动,数据类型为 long 型,因此需要在数字末尾加上 L?,如:

fseek(fp, 10L, 0);  // 将文件位置标记向前移动到离文件开头 100 个字节处
fseek(fp, -10L, 1); // 将文件位置标记向后移动到离文件当前位置 10 个字节处

可能在看代码时还会遇到名为?fseeko 或者?fseeko64 的函数,这两个函数的作用与 fseek 函数一样,唯一的不同就是 偏移量 的数据类型,前两个分别为?off_t 和 off64_t 。(off_t 及 off64_t 均为 typedef 数据,原型分别为 long int 和 long long)

  • 使用 ftell() 函数返回?文件读写位置标记?的当前位置,返回值为 long 型,该值是相对于文件开头位置的偏移量来计算的。
long i = ftell(fp);

如果返回值为 -1L ,则说明函数调用失败。

5、其他与文件相关的操作

  • ?stat() 函数

stat 函数定义在?sys/stat.h 头文件中,用来获取文件当前的状态。其函数定义为:

int stat(const char * file_name, struct stat *buf);

参数 file_name 为文件的路径名,函数将该路径下的文件的状态保存在结构体指针 buf 中,该结构体包含文件设备编号(st_dev)、文件类型和存取权限(st_mode)、文件大小(st_size)方面的信息。具体定义如下(头文件中对 stat 结构体的定义包含一些预处理代码,以下为精简版):

struct stat {
    dev_t st_dev; //device 文件的设备编号
    ino_t st_ino; //File serial number 文件的32位序列号
    mode_t st_mode; //protection 文件的类型和存取的权限
    nlink_t st_nlink; //number of hard links 连到该文件的硬连接数目, 刚建立的文件值为1.
    uid_t st_uid; //user ID of owner 文件所有者的用户识别码
    gid_t st_gid; //group ID of owner 文件所有者的组识别码
    dev_t st_rdev; //device type 若此文件为装置设备文件, 则为其设备编号
    off_t st_size; //total size, in bytes 文件大小, 以字节计算
    unsigned long st_blksize; //blocksize for filesystem I/O 文件系统的I/O 缓冲区大小.
    u nsigned long st_blocks; //number of blocks allocated 占用文件区块的个数, 每一区块大小为512 个字节.
    time_t st_atime; //time of lastaccess 文件最近一次被存取或被执行的时间, 一般只有在用mknod、 utime、read、write 与tructate 时改变.
    time_t st_mtime; //time of last modification 文件最后一次被修改的时间, 一般只有在用mknod、 utime 和write 时才会改变
    time_t st_ctime; //time of last change i-node 最近一次被更改的时间, 此参数会在文件所有者、组、 权限被更改时更新
};

?具体的可参考:

C语言stat()函数:获取文件状态_C语言中文网

linux stat函数讲解 - Leo Chin - 博客园

——以上内容总结整理自谭浩强的《C语言程序设计(第四版)》——

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-12 12:59:34  更:2021-09-12 13:01:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 1:53:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码