1、编 辑 本 段 函 数 名feof 编 辑 本 段 功 能检 测 流 上 的 文 件 结 束 符 The function feof() tests the end-of-file indicator for the stream pointed to by stream, returning non-zero if it is set. The end-of-file indicator can only be cleared by the function clearerr(). 编 辑 本 段 用 法int feof(FILE *stream); 编 辑 本 段 程 序 例#includ
2、e int main(void) FILE *stream; stream = fopen(“DUMMY.FIL“, “r“); fgets(stream); if (feof(stream) printf(“We have reached end-of-filen“); fclose(stream); return 0; feof(fp)有 两 个 返 回 值 :如 果 遇 到 文 件 结 束 , 函 数 feof( fp) 的 值 为非 零 值 , 否 则 为 0。 EOF 是 文 本 文 件 结 束 的 标 志 。 在 文 本 文 件 中 , 数 据 是 以 字 符 的 ASC 代码 值
3、 的 形 式 存 放 , 普 通 字 符 的 ASC 代 码 的 范 围 是 32 到 127( 十 进 制 ) ,EOF 的 16 进 制 代 码 为 0x1A( 十 进 制 为 26) , 因 此 可 以 用 EOF 作 为 文 件 结束 标 志 。 当 把 数 据 以 二 进 制 形 式 存 放 到 文 件 中 时 , 就 会 有 -1 值 的 出 现 , 因 此 不能 采 用 EOF 作 为 二 进 制 文 件 的 结 束 标 志 。 为 解 决 这 一 个 问 题 , ASCI C 提 供一 个 feof 函 数 , 用 来 判 断 文 件 是 否 结 束 。 feof 函 数 既
4、可 用 以 判 断 二 进 制 文件 又 可 用 以 判 断 文 本 文 件 。 “C”语 言 的 “feof()”函 数 和 数 据 库 中 “eof()”函 数 的 运 做 是 完 全不 同 的 。 数 据 库 中 “eof()”函 数 读 取 当 前 指 针 的 位 置 , “C”语 言 的“feof()”函 数 返 回 的 是 最 后 一 次 “读 操 作 的 内 容 ”。 多 年 来 把 “位 置 和内 容 ”相 混 , 从 而 造 成 了 对 这 一 概 念 的 似 是 而 非 。 那 么 , 位 置 和 内 容 到 底 有 何 不 同 呢 ? 举 个 简 单 的 例 子 , 比
5、如 有 人 说“你 走 到 火 车 的 最 后 一 节 车 箱 ”这 就 是 位 置 。 而 如 果 说 “请 你 一 直 向 后 走 ,摸 到 铁 轨 结 束 ”这 就 是 内 容 。 也 就 是 说 用 内 容 来 判 断 会 “多 走 一 节 ”。 这就 是 完 全 依 赖 于 “while(!feof(FP).”进 行 文 件 复 制 时 , 目 标 文 档 总会 比 源 文 档 “多 出 一 些 ”的 原 因 。 在 “C”文 件 读 取 操 作 时 不 能 完 全 依 赖 于 “while(!feof(FP).”的 判 断 。 下 面 代 码 是 改 进 后 的 代 码 , 该 代
6、 码 执 行 后 output 文 件 内 容 和input 文 件 内 容 一 致 , 与 使 用 “while(!feof(FP).”相 比 , input 文件 的 结 尾 符 号 ( EOF) 没 有 被 读 入 到 output 文 件 中 。 /main.c linux 下 编 译 通 过 。 int main(void) FILE *in, *out; int ch; if (in = fopen(“./input.txt“, “r“)= NULL) /input.txt must exist in current directory. fprintf(stderr, “Cann
7、ot open inputfilen“); exit(0); if(out=fopen(“./output.txt“,“w“)=NULL) fprintf(stderr,“Can not open the file.n“); exit(0); while(1) ch=fgetc(in); if(ch = -1) break; fprintf(stdout,“The ASC of char %c is %dn “,ch,ch); fputc(ch,out); fclose(in); fclose(out); return 0; 与 EOF 的 区 别 在 stdio.h 中 可 以 看 到 如
8、下 定 义 : #define EOF (-1) #define _IOEOF 0x0010 #define feof(_stream) (_stream)-_flag while(!feof(fp) c = fgetc(fp); printf(“%Xn“, c); 会 发 现 多 输 出 了 一 个 FF, 原 因 就 是 在 读 完 最 后 一 个 字 符 后 , fp-flag仍 然 没 有 被 置 为 _IOEOF, 因 而 feof()仍 然 没 有 探 测 到 文 件 结 尾 。 直 到 再 次调 用 fgetc()执 行 读 操 作 , feof()才 能 探 测 到 文 件 结 尾 。 这 样 就 多 输 出 了 一个 -1(即 FF)。 正 确 的 写 法 应 该 是 : int c; c = fgetc(fp); while(!feof(fp) printf(“%Xn“, c); c = fgetc(fp); feof()可 以 用 EOF 代 替 吗 ? 不 可 以 。 fgetc 返 回 -1 时 , 有 两 种 情 况 :读 到 文 件 结 尾 或 是 读 取 错 误 。 因 此 我 们 无 法 确 信 文 件 已 经 结 束 , 因 为 可 能是 读 取 错 误 ! 这 时 我 们 需 要 feof()。