C 语 言 - - - 文 件 操 作
C 语 言 - - - 文 件 操 作
- 文 件
- 文 件 名
- 文 件 操 作
- fopen
- fclose
- 文 件 的 顺 序 读 写
- fputc
- fgetc
- fputs
- fgets
- fprintf
- fscanf
- fwrite
- fread
- 流
- 文 件 的 随 机 读 写
- fseek
- ftell
- rewind
- 总结
💻作 者 简 介:曾 与 你 一 样 迷 茫,现 以 经 验 助 你 入 门 C 语 言
💡个 人 主 页:@ 笑 口 常 开 xpr 的 个 人 主 页
📚系 列 专 栏:C 启 新 程
✨代 码 趣 语:程 序 应 该 是 写 给 其 他 人 读 的,让 机 器 来 运 行 它 只 是 一 个 附 带 功 能。
💪代 码 千 行,始 于 坚 持,每 日 敲 码,进 阶 编 程 之 路。
📦gitee 链 接:gitee
在 编 程 的 世 界 里,每 一 行 代 码 都 可 能 隐 藏 着 无 限 的 可 能 性 。你 是 否 想 过,一 个 小 小 的 程 序 究 竟 能 改 变 什 么?它 可 以 是 解 决 复 杂 问 题 的 工 具 ,也 可 以 是 实 现 梦 想 的 桥 梁。今 天,就 让 我 们 一 起 走 进 C 语 言 文 件 的 世 界,探 索 它 的 无 限 潜 力。
文 件
定 义
文 件 是 存 储 在 外 部 存 储 介 质(如 硬 盘、光 盘、U 盘 等)上 的 一 组 相 关 数 据 的 集 合,这 些 数 据 可 以 是 文 本、图 像、音 频、视 频、程 序 代 码 等 各 种 类 型。文 件 可 以 被 操 作 系 统 和 应 用 程 序 识 别、读 取、写 入 和 管 理,是 计 算 机中 数 据 存 储 和 传 输 的 基 本 单 位。
程 序 文 件
程 序 文 件 是 包 含 计 算 机 程 序 代 码 的 文 件,这 些 代 码 由 编 程 语 言 编 写 而 成,用 于 指 示 计 算 机 执 行 特 定 的 任 务 和 操 作,以 实 现 各 种 功 能。
数 据 文 件
数 据 文 件 是 用 于 存 储 数 据 的 文 件,其 目 的 是 保 存 各 种 类 型 的 数 据,以 便 程 序 在 运 行 时 能 够 读 取、处 理 和 更 新 这 些 数 据。数 据 文 件 可 以 独 立 于 程 序 存 在,方 便 数 据 的 长 期 存 储 和 共 享。
文 件 名
定 义
文 件 名 是 文 件 在 计 算 机 文 件 系 统 中 的 标 识,用 于 区 分 不 同 的 文 件,方 便 用 户 和 计 算 机 系 统 对 文 件 进 行 管 理、识 别 和 操 作。
组 成 部 分
文 件 名 包 含 3 部 分:文 件 路 径 + 文 件 名 主 干 + 文 件 后 缀
文 件 路 径
相 对 路 径
相 对 路 径 是 相 对 于 当 前 工 作 目 录 的 路 径,它 依 赖 于 程 序 运 行 时 的 当 前 工 作 目 录 来 确 定 文 件 的 位 置。
以 VS 为 例 找 到 文 件 的 储 存 位 置,如 下 图 所 示,鼠 标 右 击 文 件 名,然 后 点 击 打 开 所 在 的 文 件 夹 即 可。
绝 对 路 径
绝 对 路 径 是 从 文 件 系 统 的 根 目 录 开 始 的 完 整 路 径,它 能 唯 一 确 定 文 件 在 文 件 系 统 中 的位 置,不 依 赖 于 当 前 工 作 目 录。
例 如 :c:\code\test.txt
注 意
为 文 件 起 名 时,最 好 使 用 数 字、字 母 和 下 划 线,且 不 要 以 数 字 开 头,否 则 代 码 会 出 错。
文 件 操 作
文 件 指 针
每 个 被 使 用 的 文 件 都 在 内 存 中 开 辟 了 一 个 相 应 的 文 件 信 息 区,用 来 存 放 文 件 的 相 关 信 息( 如 文 件 的 名 字,文 件 状 态 及 文 件 当 前 的 位 置 等)。这 些 信 息 是 保 存 在 一 个 结 构 体 变 量 中 的。该 结 构 体 类 型 是 由 系 统 声 明 的,取 名 FILE。FILE 名 字 不 能 更 改,否 则 代 码 会 报 错。每 当 打 开 一 个 文 件 的 时 候,系 统 会 根 据 文 件 的 情 况 自 动 创 建 一 个 FILE 结 构 的 变 量,并 填 充 其 中 的 信 息。
在 C 语 言 中,使 用 FILE 类 型 的 指 针 来 管 理 文 件。FILE 是 一 个 结 构 体 类 型,包 含 了 与 文 件 相 关 的 信 息,如 文 件 描 述 符 、 缓 冲 区 等。
下 面 展 示
代 码 示 例
。
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 变 量 来 指 示 具 体 的 错 误 原 因。
下 面 展 示
代 码 示 例
。
#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+”)打 开 且 文 件 已 存 在,会 覆 盖 原 文 件 内 容 后 再 写 入。
下 面 展 示
代 码 示 例
。
#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 函 数 来 区 分 是 文 件 结 束 还 是 发 生 了 错 误。
下 面 展 示
代 码 示 例
。
#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 函 数 进 一 步 检 查 错 误 信 息。
下 面 展 示
代 码 示 例
。
#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。
下 面 展 示
代 码 示 例
。
#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 会 返 回 实 际 写 入 的 字 符 数;若 出 现 错 误,则 返 回 一 个 负 数。
下 面 展 示
代 码 示 例
。
#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。
下 面 展 示
代 码 示 例
。
#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,则 表 示 可 能 发 生 了 错 误 或 到 达了 文 件 末 尾。
下 面 展 示
代 码 示 例
。
#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,可 能 是 到 达 文 件 末 尾,也 可 能 是 发 生 了 读 取 错 误。
下 面 展 示
代 码 示 例
。
#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)
通 常 和 键 盘 关 联,用 于 程 序 从 键 盘 读 取 输 入 数 据。
下 面 展 示
代 码 示 例
。
#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。
若 执 行 失 败,返 回 非 零 值。
下 面 展 示
代 码 示 例
。
#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 来 指 示 具 体 的 错 误 类 型。
下 面 展 示
代 码 示 例
。
#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 函 数 检 测 的 标 志)。
下 面 展 示
代 码 示 例
。
#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 语 言 的 世 界 里 持 续 深 耕,书 写 属 于 自 己 的 编 程 传 奇,下 一 次 开 启 ,定 有 全 新 的 精 彩 等 待。小 编 期 待 重 逢,盼 下 次 阅 读 见 你 们 更 大 进 步,共 赴 代 码 之 约!