C 语 言 - - - 文 件 操 作

C 语 言 - - - 文 件 操 作

💻作 者 简 介:曾 与 你 一 样 迷 茫,现 以 经 验 助 你 入 门 C 语 言

💡个 人 主 页:@ 笑 口 常 开 xpr 的 个 人 主 页

📚系 列 专 栏:C 启 新 程

✨代 码 趣 语:程 序 应 该 是 写 给 其 他 人 读 的,让 机 器 来 运 行 它 只 是 一 个 附 带 功 能。

💪代 码 千 行,始 于 坚 持,每 日 敲 码,进 阶 编 程 之 路。

📦gitee 链 接:gitee

在 编 程 的 世 界 里,每 一 行 代 码 都 可 能 隐 藏 着 无 限 的 可 能 性 。你 是 否 想 过,一 个 小 小 的 程 序 究 竟 能 改 变 什 么?它 可 以 是 解 决 复 杂 问 题 的 工 具 ,也 可 以 是 实 现 梦 想 的 桥 梁。今 天,就 让 我 们 一 起 走 进 C 语 言 文 件 的 世 界,探 索 它 的 无 限 潜 力。

文 件

定 义
文 件 是 存 储 在 外 部 存 储 介 质(如 硬 盘、光 盘、U 盘 等)上 的 一 组 相 关 数 据 的 集 合,这 些 数 据 可 以 是 文 本、图 像、音 频、视 频、程 序 代 码 等 各 种 类 型。文 件 可 以 被 操 作 系 统 和 应 用 程 序 识 别、读 取、写 入 和 管 理,是 计 算 机中 数 据 存 储 和 传 输 的 基 本 单 位。
程 序 文 件
程 序 文 件 是 包 含 计 算 机 程 序 代 码 的 文 件,这 些 代 码 由 编 程 语 言 编 写 而 成,用 于 指 示 计 算 机 执 行 特 定 的 任 务 和 操 作,以 实 现 各 种 功 能。
数 据 文 件
数 据 文 件 是 用 于 存 储 数 据 的 文 件,其 目 的 是 保 存 各 种 类 型 的 数 据,以 便 程 序 在 运 行 时 能 够 读 取、处 理 和 更 新 这 些 数 据。数 据 文 件 可 以 独 立 于 程 序 存 在,方 便 数 据 的 长 期 存 储 和 共 享。

文 件 名

定 义
文 件 名 是 文 件 在 计 算 机 文 件 系 统 中 的 标 识,用 于 区 分 不 同 的 文 件,方 便 用 户 和 计 算 机 系 统 对 文 件 进 行 管 理、识 别 和 操 作。
组 成 部 分
文 件 名 包 含 3 部 分:文 件 路 径 + 文 件 名 主 干 + 文 件 后 缀
文 件 路 径
相 对 路 径
相 对 路 径 是 相 对 于 当 前 工 作 目 录 的 路 径,它 依 赖 于 程 序 运 行 时 的 当 前 工 作 目 录 来 确 定 文 件 的 位 置。
以 VS 为 例 找 到 文 件 的 储 存 位 置,如 下 图 所 示,鼠 标 右 击 文 件 名,然 后 点 击 打 开 所 在 的 文 件 夹 即 可。

绝 对 路 径
绝 对 路 径 是 从 文 件 系 统 的 根 目 录 开 始 的 完 整 路 径,它 能 唯 一 确 定 文 件 在 文 件 系 统 中 的位 置,不 依 赖 于 当 前 工 作 目 录。
例 如 :c:\code\test.txt
注 意
为 文 件 起 名 时,最 好 使 用 数 字、字 母 和 下 划 线,且 不 要 以 数 字 开 头,否 则 代 码 会 出 错。

文 件 操 作

文 件 指 针
每 个 被 使 用 的 文 件 都 在 内 存 中 开 辟 了 一 个 相 应 的 文 件 信 息 区,用 来 存 放 文 件 的 相 关 信 息( 如 文 件 的 名 字,文 件 状 态 及 文 件 当 前 的 位 置 等)。这 些 信 息 是 保 存 在 一 个 结 构 体 变 量 中 的。该 结 构 体 类 型 是 由 系 统 声 明 的,取 名 FILE。FILE 名 字 不 能 更 改,否 则 代 码 会 报 错。每 当 打 开 一 个 文 件 的 时 候,系 统 会 根 据 文 件 的 情 况 自 动 创 建 一 个 FILE 结 构 的 变 量,并 填 充 其 中 的 信 息。
在 C 语 言 中,使 用 FILE 类 型 的 指 针 来 管 理 文 件。FILE 是 一 个 结 构 体 类 型,包 含 了 与 文 件 相 关 的 信 息,如 文 件 描 述 符 、 缓 冲 区 等。
下 面 展 示代 码 示 例

javascript 复制代码
FILE *pf;  // 定义一个文件指针

定 义 pf 是 一 个 指 向 FILE 类 型 数 据 的 指 针 变 量。可 以 使 pf 指 向 某 个 文 件 的 文 件 信 息 区(一 个 结 构 体 变 量 )。通 过 该 文 件 信 息 区 中 的 信 息 就 能 够 访 问 该 文 件。也 就 是 说,通 过 文 件 指 针 变 量 能 够 找 到 与 它 关 联 的 文 件。

fopen


定 义
在 C 语 言 中,fopen 函 数 是 用 于 打 开 文 件 的 重 要 函 数,fopen 函 数 定 义 于 <stdio.h> 头 文 件 中。
函 数 原 型

复制代码
FILE *fopen(const char *filename, const char *mode);

参 数
filename - - - 这 是 一 个 指 向 以 空 字 符 结 尾 的 字 符 串 的 指 针,代 表 着 要 打 开 的 文 件 的 名称。它 可 以 是 一 个 相 对 路 径 或 者 绝 对 路 径 。
mode:同 样 是 一 个 指 向 以 空 字 符 结 尾 的 字 符 串 的 指 针,用 于 指 定 文 件 的 打 开 模 式。

返 回 值
若 文 件 成 功 打 开,fopen 函 数 会 返 回 一 个 指 向 FILE 类 型 对 象 的 指 针,这 个 指 针 后 续 可 用 于 对 文 件 进 行 读 写 等 操 作。
若 文 件 打 开 失 败,函 数 会 返 回 NULL,同 时 可 能 会 设 置 errno 变 量 来 指 示 具 体 的 错 误 原 因。

fclose

定 义
在 C 语 言 的 文 件 操 作 中,fclose 函 数 主 要 用 于 关 闭 先 前 使 用 fopen 函 数 打 开 的 文 件。fclose 函 数 定 义 于 <stdio.h> 头 文 件 中。
函 数 原 型

复制代码
int fclose(FILE *stream);

参 数
stream - - - 这 是 一 个 指 向 FILE 类 型 对 象 的 指 针,该 对 象 代 表 了 要 关 闭 的 文 件 流。此 指 针 通 常 是 调 用 fopen 函 数 成 功 打 开 文 件 后 返 回 的 指 针。
返 回 值
若 文 件 成 功 关 闭,fclose 函 数 会 返 回 0。
若 关 闭 文 件 时 出 现 错 误,函 数 会 返 回 EOF( 通 常 定 义 为 -1 ),并 且 可 能 会 设 置 errno 变 量 来 指 示 具 体 的 错 误 原 因。
下 面 展 示代 码 示 例

javascript 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
	//FILE* fp = fopen("D:\\VS_dai_ma\\gitee\\c-language-learning\\test1.txt", "r");//绝对路径
	FILE* fp = fopen("test2.txt", "w");//相对路径,test.c文件的位置
	//FILE* fp = fopen("../test3.txt", "r");//../表示上一级
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}
	else
	{
		printf("打开文件成功\n");
	}
	//关闭文件
	fclose(fp);
	fp = NULL;
	return 0;
}


文 件 的 顺 序 读 写

fputc

定 义
在 C 语 言 的 文 件 操 作 中,fputc 函 数 主 要 用 于 从 文 件 中 写 入 单 个 字 符 的 函 数。fputc 函 数 定 义 于 <stdio.h> 头 文 件 中。
函 数 原 型

复制代码
int fputc(int c, FILE *stream);

参 数
c - - - 要 写 入 的 字 符。虽 然 参 数 类 型 是 int,但 实 际 上 是 将 该 整 数 对 应 的 ASCII 码 字 符 写 入 文 件,函 数 会 将 其 转 换 为 unsigned char 类 型 进 行 处 理。
stream - - - 指 向 FILE 类 型 对 象 的 指 针,表 示 要 写 入 的 目 标 文 件 流。需 要 以 可 写 模 式( 如 "w"、"a"、"w+" 等)打 开。
返 回 值
若 字 符 成 功 写 入 文 件 流,函 数 返 回 写 入 的 字 符(被 提 升 为 int 类 型)。
若 写 入 过 程 中 发 生 错 误,函 数 返 回 EOF,可 以 通 过 ferror 函 数 进 一 步 检 查 错 误 信 息。
功 能 作 用
fputc 函 数 的 主 要 功 能 是 将 指 定 的 字 符 写 入 到 指 定 的 文 件 流 中,并 将 文 件 内 部 的 位 置 指 针 向 后 移 动 一 个 字 节,指 向 下 一 个 写 入 位 置。如 果 文 件 以 追 加 模 式("a" 或 "a+")打 开,字 符 会 被 添 加 到 文 件 末 尾;如 果 以 写 入 模 式("w" 或 "w+")打 开 且 文 件 已 存 在,会 覆 盖 原 文 件 内 容 后 再 写 入。
下 面 展 示代 码 示 例

javascript 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
	FILE* pf = fopen("test.txt", "w");//根目录,test.c文件的位置
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	char ch = 0;
	for (ch = 'a';ch <= 'z';ch++)
	{
		fputc(ch, pf);
		fputc(' ', pf);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

fgetc

定 义
在 C 语 言 的 文 件 操 作 中,fgetc 函 数 主 要 用 于 从 文 件 流 中 读 取 一 个 字 符。fgetc 函 数 定 义 于 <stdio.h> 头 文 件 中。
函 数 原 型

复制代码
int fgetc(FILE *stream);

参 数
stream - - - 指 向 FILE 类 型 对 象 的 指 针,代 表 要 读 取 的 文 件 流。
返 回 值
成 功 读 取 时,返 回 读 取 到 的 字 符,返 回 值 会 被 提 升 为 int 类 型( 为 了 能 包 含 文 件 结 束 标 志 EOF )。
到 达 文 件 末 尾 或 者 读 取 过 程 中 发 生 错 误 时,返 回 EOF。可 以 通 过 feof 函 数 和 ferror 函 数 来 区 分 是 文 件 结 束 还 是 发 生 了 错 误。
下 面 展 示代 码 示 例

javascript 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");//根目录,test.c文件的位置
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	int i = 0;
	for (i = 0;i < 52;i++)
	{
		int a = fgetc(pf);
		printf("%c",a);
	}
	printf("\n");
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

fputs

定 义
在 C 语 言 的 文 件 操 作 中,fputs 函 数 主 要 用 于 将 一 个 字 符 串 写 入 到 指 定 的 文 件 流 里。fputs 函 数 定 义 于 <stdio.h> 头 文 件 中。
函 数 原 型

复制代码
int fputs(const char *str, FILE *stream);

参 数
str - - - 这 是 一 个 指 向 以 空 字 符 '\0' 结 尾 的 字 符 串 的 指 针,也 就 是 要 写 入 文 件 流 的 字 符 串。
stream - - - 指 向 FILE 类 型 对 象 的 指 针,代 表 要 写 入 的 目 标 文 件 流。该 文 件 流 通 常 是 通 过 fopen 函 数 以 可 写 模 式(像 "w"、"a"、"w+" 等)打 开 的。
返 回 值
若 字 符 串 成 功 写 入 文 件 流,函 数 返 回 一 个 非 负 整 数。
若 写 入 过 程 中 出 现 错 误,函 数 返 回 EOF。可 以 借 助 ferror 函 数 进 一 步 检 查 错 误 信 息。
下 面 展 示代 码 示 例

javascript 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
	FILE* pf = fopen("test.txt", "w");//根目录,test.c文件的位置
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("Hello World!\n", pf);
	fputs("Hello World!\n", pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

fgets

定 义
在 C 语 言 的 文 件 操 作 中,fgets 函 数 主 要 用 于 从 指 定 的 流(文 件 或 者 标 准 输 入)里 读 取 一 行 字 符,并 且 将 其 存 储 于 指 定 的 字 符 数 组 中。fgets 函 数 定 义 于 <stdio.h> 头 文 件 中。
函 数 原 型

复制代码
char *fgets(char *str, int n, FILE *stream);

参 数
str - - - 这 是 一 个 指 向 字 符 数 组 的 指 针,读 取 到 的 字 符 串 会 被存 储 在 此 数 组 中。
n - - - 该 参 数 表 示 要 读 取 的 最 大 字 符 数(包 含 最 后 的 空 字 符 '\0')。fgets 最 多 会 读 取 n - 1 个 字 符,最 后 一 个 位 置 留 给 空 字 符 '\0'。
stream - - - 此 为 指 向 FILE 对 象 的 指 针,该 对 象 标 识 了 要 从 中 读 取 数 据 的 流。可 以 是 文 件 流,也 可 以 是 标 准 输 入 流 stdin。
返 回 值
若 读 取 成 功,fgets 会 返 回 指 向 str 的 指 针。
若 在 读 取 过 程 中 遇 到 文 件 结 束 符( EOF ),且 未 读 取 到 任 何 字 符, 就 会 返 回 NULL。
若 读 取 时 发 生 错 误,同 样 会 返 回 NULL。
下 面 展 示代 码 示 例

javascript 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");//根目录,test.c文件的位置
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	char arr[20]= { 0 };
	fgets(arr, 19, pf);//会读到'\n'
	printf("%s", arr);
	fgets(arr, 19, pf);
	printf("%s", arr);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

fprintf



定 义
在 C 语 言 的 文 件 操 作 中,fprintf 函 数 主 要 用 于 从 格 式 化 的 数 据 写 入 到 指 定 的 文 件 流 中。fprintf 函 数 定 义 于 <stdio.h> 头 文 件 中。
函 数 原 型

复制代码
int fprintf(FILE *stream, const char *format, ...);

参 数
stream - - - 这 是 一 个 指 向 FILE 对 象 的 指 针,此 对 象 代 表 了 要 写 入 数 据 的 输 出 流。
format - - - 这 是 一 个 字 符 串,其 中 包 含 了 普 通 字 符 和 格 式 说 明 符。普 通 字 符 会 原 样输 出 到 文 件 中,而 格 式 说 明 符(如 %d、%f、%s 等)会 被 后 面 可 变 参 数 的 值 替 换。
... - - - 这 是 可 变 参 数 列 表,它 的 内 容 会 按 照 format 字 符 串 中 的 格 式 说 明 符 进 行 格 式 化 并 写 入 文 件。
返 回 值
如 果 操 作 成 功,fprintf 会 返 回 实 际 写 入 的 字 符 数;若 出 现 错 误,则 返 回 一 个 负 数。
下 面 展 示代 码 示 例

javascript 复制代码
#include <stdio.h>
#include <string.h>
struct S
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct S s = { "zhangsan",20,95.5 };
	FILE* pf = fopen("test2.txt", "w");//根目录,test.c文件的位置
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fprintf(pf, "%s %d %f\n", s.name, s.age, s.score);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

fscanf



定 义
在 C 语 言 的 文 件 操 作 中,fscanf 函 数 主 要 用 于 从 文 件 流 里 读 取 格 式 化 输 入。fscanf 函 数 定 义 于 <stdio.h> 头 文 件 中。
函 数 原 型

复制代码
int fscanf(FILE *stream, const char *format, ...);

参 数
stream - - - 指 向 FILE 对 象 的 指 针,此 对 象 标 识 了 要 从 中 读 取 数 据 的 输 入 流。
format - - - 一 个 字 符 串,规 定 了 输 入 数 据 的 格 式。它 能 够 包 含 普 通 字 符 和 格 式 说 明 符。
... - - - 可 变 参 数 列 表,代 表 用 来 存 储 读 取 数 据 的 变 量 的 地 址。
返 回 值
若 成 功,fscanf 会 返 回 成 功 匹 配 并 赋 值 的 输 入 项 数 量。

若 在 输 入 匹 配 之 前 到 达 文 件 末 尾,就 会 返 回 EOF。

若 出 现 读 取 错 误,也 会 返 回 EOF。
下 面 展 示代 码 示 例

javascript 复制代码
#include <stdio.h>
#include <string.h>
struct S
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct S s = { "zhangsan",20,95.5 };
	FILE* pf = fopen("test2.txt", "r");//根目录,test.c文件的位置
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fscanf(pf, "%s %d %f\n", s.name, &(s.age), &(s.score));
	printf("%s %d %f\n", s.name, s.age, s.score);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

fwrite

定 义
在 C 语 言 的 文 件 操 作 中,fwrite 函 数 主 要 用 于 将 数 据 块(二 进 制 形 式) 写 入 到 指 定 的 文 件 流 中。fwrite 函 数 定 义 于 <stdio.h> 头 文 件 中。
函 数 原 型

复制代码
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

参 数
ptr - - - 指 向 要 写 入 的 数 据 块 的 指 针,该 数 据 块 可 以 是 数 组、结 构 体 等 任 意 类 型 的 数 据。
size - - - 每 个 数 据 项 的 大 小( 以 字 节 为 单 位 )。
nmemb - - - 要 写 入 的 数 据 项 的 数 量。
stream - - - 指 向 FILE 对 象 的 指 针,该 对 象 标 识 了 要 写 入 数 据 的 输 出 流,可 以 是 文 件 流 或 标 准 输 出 流 等。
返 回 值
fwrite 函 数 返 回 实 际 成 功 写 入 的 数 据 项 的 数 量(而 不 是 字 节 数)。如 果 返 回 值 小 于 nmemb,则 表 示 可 能 发 生 了 错 误 或 到 达了 文 件 末 尾。
下 面 展 示代 码 示 例

javascript 复制代码
#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct S s = { "zhangsan",23,96.5 };
	FILE* pf = fopen("test.txt", "wb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fwrite(&s, sizeof(struct S), 1, pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

fread


定 义
在 C 语 言 的 文 件 操 作 中,fread 函 数 主 要 用 于 从 文 件 流(二 进 制 文 件) 读 取 数 据 块 的 函 数。fread 函 数 定 义 于 <stdio.h> 头 文 件 中。
函 数 原 型

复制代码
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

参 数
ptr - - - 指 向 用 于 存 储 读 取 数 据 的 内 存 块 的 指 针。这 个 内 存 块 需 足 够 大,以 容 纳 要 读 取 的 数 据。
size - - - 每 个 数 据 项 的 大 小(以 字 节 为 单 位)。
nmemb - - - 要 读 取 的 数 据 项 的 数 量。
stream - - - 指 向 FILE 对 象 的 指 针,此 对 象 标 识 了 要 从 中 读 取 数 据 的 输 入 流。
返 回 值
返 回 实 际 成 功 读 取 的 数 据 项 的 数 量( 并 非 字 节 数 )。

若 返 回 值 小 于 nmemb,可 能 是 到 达 文 件 末 尾,也 可 能 是 发 生 了 读 取 错 误。
下 面 展 示代 码 示 例

javascript 复制代码
#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct S s = { "zhangsan",23,96.5 };
	FILE* pf = fopen("test.txt", "rb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	fread(&s, sizeof(struct S), 1, pf);
	printf("%s %d %f\n", s.name, s.age, s.score);
	fclose(pf);
	pf = NULL;
	return 0;
}

总 结

定 义
流 是 一 个 核 心 概 念,它 为 程 序 和 外 部 设 备(像 文 件、键 盘 等)之 间 的 数 据 传 输 提 供 了 一 种 抽 象 方 式。流 可 以 理 解 成 一 个 有 序 的 字 节 序 列,它 屏 蔽 了 数 据 传 输 的 底 层 细 节,让 程 序 能 够 以 统 一 的 方 式 与 不 同 的 外 部 设 备 进 行 数 据 交 互。不 管 是 从 文 件 读 取 数 据,还 是 向 屏 幕 输 出 数 据,都 可 以 借 助 流 来 完 成。
分 类
文 本 流
文 本 流 由 一 系 列 的 行 构 成,每 行 以 换 行 符 '\n' 结 尾。
二 进 制 流
二 进 制 流 是 字 节 的 直 接 序 列,不 会 对 数 据 做 任 何 转 换。数 据 在 二 进 制 流 中 的 存 储 形 式 和 在 内 存 中 的 存 储 形 式 相 同,不 会 进 行 换 行 符 的 转 换 或 其 他 处 理。
标 准 流
标 准 输 入 流(stdin)
通 常 和 键 盘 关 联,用 于 程 序 从 键 盘 读 取 输 入 数 据。
下 面 展 示代 码 示 例

javascript 复制代码
#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct S s = { 0 };
	//格式化输入输出
	fscanf(stdin, "%s %d %f", s.name, &(s.age), &(s.score));//从键盘输入
	fprintf(stdout, "%s %d %f\n", s.name, s.age, s.score);//从屏幕输出
	return 0;
}

标 准 输 出 流(stdout)
一 般 和 显 示 器 关 联,用 于 程 序 向 屏 幕 输 出 数 据。
标 准 错 误 流(stderr)
同 样 和 显 示 器 关 联,主 要 用 于 输 出 程 序 运 行 过 程 中 的 错 误 信 息。与 标 准 输 出 流 不 同 的 是,标 准 错 误 流 不 会 被 缓 冲,这 意 味 着 错 误 信 息 会 立 即 显 示 在 屏 幕 上。

文 件 的 随 机 读 写

fseek

定 义
在 C 语 言 的 文 件 操 作 中,fseek 函 数 主 要 用 于 重 新 定 位 文 件 指 针 的 位 置。fseek 函 数 定 义 于 <stdio.h> 头 文 件 中。
函 数 原 型

复制代码
int fseek(FILE *stream, long int offset, int whence);

参 数
stream - - - 指 向 FILE 对 象 的 指 针,该 对 象 代 表 了 要 操 作 的 文 件 流。
offset - - - 偏 移 量,为 long int 类 型。它 表 示 从 whence 指 定 的 起 始 位 置 开 始,文 件 指 针 需 要 移 动 的 字 节 数。正 数 表 示 向 文 件 末 尾 方 向 移 动,负 数 表 示 向 文 件 开 头 方 向 移 动。
whence - - - 起 始 位 置,是 一 个 整 数 常 量,有 三 种 取 值:

SEEK_SET - - - 文 件 开 头。此 时 offset 必 须 是 非 负 的,文 件 指 针 会 从 文 件 开 头 处 偏 移 offset 个 字 节。

SEEK_CUR - - - 文 件 指 针 当 前 位 置。offset 可 正 可 负,文 件 指 针 会 从 当 前 位 置 偏 移 offset 个 字 节。

SEEK_END - - - 文 件 末 尾。offset 通 常 为 负 数,文 件 指 针 会 从 文 件 末 尾 处 向 前 偏 移 offset 个 字 节。
返 回 值
若 函 数 执 行 成 功,返 回 值 为 0。

若 执 行 失 败,返 回 非 零 值。
下 面 展 示代 码 示 例

javascript 复制代码
#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	else
	{
		int ch = fgetc(pf);
		printf("%c\n", ch);
		ch = fgetc(pf);
		printf("%c\n", ch);
		ch = fgetc(pf);
		printf("%c\n", ch);
		fseek(pf, 0, SEEK_SET);
		ch = fgetc(pf);
		printf("%c\n", ch);
		fclose(pf);
		pf = NULL;
	}
	return 0;
}


ftell

定 义
在 C 语 言 的 文 件 操 作 中,ftell 函 数 主 要 用 于 获 取 文 件 指 针 当 前 在 文 件 中 的 位 置。ftell 函 数 定 义 于 <stdio.h> 头 文 件 中。
函 数 原 型

复制代码
long int ftell(FILE *stream);

参 数
stream - - - 指 向 FILE 对 象 的 指 针,该 对 象 代 表 了 你 要 操 作 的 文 件 流。
返 回 值
如 果 函 数 执 行 成 功,ftell 会 返 回 当 前 文 件 指 针 相 对 于 文 件 开 头 的 偏 移 量,单 位 是 字 节,返 回 值 类 型 为 long int。

如 果 执 行 失 败,函 数 会 返 回 -1L,并 且 会 设 置 errno 来 指 示 具 体 的 错 误 类 型。
下 面 展 示代 码 示 例

javascript 复制代码
#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	else
	{
		int ch = fgetc(pf);
		printf("%c\n", ch);
		ch = fgetc(pf);
		printf("%c\n", ch);
		ch = fgetc(pf);
		printf("%c\n", ch);
		fseek(pf, 1, SEEK_SET);
		ch = fgetc(pf);
		printf("%c\n", ch);
		printf("%d\n", ftell(pf));//偏移量
		fclose(pf);
		pf = NULL;
	}
	return 0;
}


rewind

定 义
在 C 语 言 的 文 件 操 作 中,rewind 函 数 主 要 用 于 把 文 件 指 针 重 新 定 位 到 文 件 的 开 头。rewind 函 数 定 义 于 <stdio.h> 头 文 件 中。
函 数 原 型

复制代码
void rewind(FILE *stream);

参 数
stream - - - 指 向 FILE 对 象 的 指 针,此 对 象 代 表 了 要 操 作 的 文 件 流。
返 回 值
rewind 函 数 没 有 返 回 值,其 返 回 类 型 为 void。
功 能
调 用 rewind 函 数 时,它 会 将 指 定 文 件 流 的 文 件 指 针 移 回 到 文 件 的 起 始 位 置,同 时 会 清 除 文 件 结 束 标 志(feof 函 数 检 测 的 标 志)和 错 误 标 志(ferror 函 数 检 测 的 标 志)。
下 面 展 示代 码 示 例

javascript 复制代码
#include<stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	else
	{
		int ch = fgetc(pf);
		printf("%c\n", ch);
		ch = fgetc(pf);
		printf("%c\n", ch);
		ch = fgetc(pf);
		printf("%c\n", ch);
		fseek(pf, 1, SEEK_SET);
		ch = fgetc(pf);
		printf("%c\n", ch);
		printf("%d\n", ftell(pf));//偏移量
		rewind(pf);
		ch = fgetc(pf);
		printf("%c\n", ch);
		fclose(pf);
		pf = NULL;
	}
	return 0;
}



总结

至 此,关 于 C 语 言 的 文 件 探 索 暂 告 一 段 落,但 你 的 编 程 征 程 才 刚 刚 启 航。写 代 码 是 与 机 器 深 度 对 话,过 程 中 虽 会 在 语 法、算 法 困 境 里 挣 扎,但 这 些 磨 砺 加 深 了 对 代 码 的 理 解。愿 你 合 上 电 脑 后,灵 感 不 断,在 C 语 言 的 世 界 里 持 续 深 耕,书 写 属 于 自 己 的 编 程 传 奇,下 一 次 开 启 ,定 有 全 新 的 精 彩 等 待。小 编 期 待 重 逢,盼 下 次 阅 读 见 你 们 更 大 进 步,共 赴 代 码 之 约!

相关推荐
未来之窗软件服务13 分钟前
创意Python爱心代码分享
开发语言·python·仙盟创梦ide·程序员表白
firshman_start39 分钟前
第六章,BGP---边界网关协议
开发语言·网络·php
山海风z1 小时前
力扣 : 871. 最低加油次数
c语言·数据结构·c++·算法·leetcode
依旧阳光的老码农1 小时前
Qt SQL 核心类说明文档
开发语言·sql·qt
小梦白2 小时前
RPG7.准备GAS的工作
java·开发语言
武昌库里写JAVA2 小时前
【iview】icon样式
java·开发语言·spring boot·学习·课程设计
-XWB-2 小时前
【Java】打印运行环境中某个类引用的jar版本路径
java·开发语言
Cuit小唐2 小时前
C++ 单例模式详解
开发语言·c++·单例模式
正在走向自律3 小时前
Python面向对象编程实战:从类定义到高级特性的进阶之旅(2/10)
开发语言·python·面向对象·python基础知识
o0向阳而生0o3 小时前
34、简述 Application,session,cookie,cache,viewState
开发语言·c#·.net