大家好,欢迎来到IT知识分享网。
一句话理解 fgetc
「从文件的‘传送带’(文件流)上逐个扫描字符,返回扫描到的字符;若传送带结束(文件末尾)或故障,返回特殊信号 EOF!」
函数原型
#include
int fgetc(FILE *stream); // 返回值是int类型(非char)
入口参数
参数 |
类型 |
比喻解释 |
stream |
FILE* |
字符的「传送带」(文件指针) |
返回参数
返回值 |
含义 |
int |
扫描到的字符(ASCII码,0~255) |
EOF |
传送带结束(文件尾)或扫描故障 |
核心功能图解
文件内容:H e l l o ⏎ 调用 fgetc(file) → 依次返回 'H', 'e', 'l', 'l', 'o', '\n', EOF
代码实例:逐字符读取文件
场景1:统计文件中的字符数量
#include
int main() { FILE *file = fopen("poem.txt", "r"); // 打开文件 if (!file) { perror(" 文件打开失败"); return 1; } int char_count = 0; int c; // 必须用int接收返回值(兼容EOF) // 循环扫描字符,直到EOF while ((c = fgetc(file)) != EOF) { char_count++; putchar(c); // 顺带打印到屏幕 } printf("\n文件总字符数:%d\n", char_count); fclose(file); return 0; }
场景2:实现文件复制(逐字符拷贝)
#include
int main() { FILE *src = fopen("source.txt", "r"); FILE *dest = fopen("copy.txt", "w"); if (!src || !dest) { perror("❌ 文件操作失败"); return 1; } int c; while ((c = fgetc(src)) != EOF) { fputc(c, dest); // 将字符写入目标文件 } fclose(src); fclose(dest); printf("✅ 文件复制完成\n"); return 0; }
⚠️ 常见错误与注意事项
1.错误:用 char 接收返回值
char c = fgetc(file); // ❌ 无法正确检测EOF(某些系统char为无符号) int c = fgetc(file); // ✅ 必须用int类型
2.忽略错误检查
FILE *file = fopen("data.txt", "r"); // 未检查file是否为NULL → 若打开失败,fgetc会崩溃!
3.文件未关闭
while (fgetc(file) != EOF) { ... } // 循环结束后忘记 fclose(file) → 内存泄漏!
技术细节剖析
1.为什么返回 int 而不是 char?
- EOF 是一个特殊值(通常为-1),而 char 类型无法区分-1和255(无符号时)。
- 用 int 可以明确区分正常字符和 EOF。
2.与 getc 的异同
函数 |
实现方式 |
适用场景 |
fgetc |
普通函数 |
通用场景,更安全 |
getc |
宏定义(可能更快) |
性能敏感场景 |
高级技巧:模拟 cat 命令
#include
void print_file(FILE *file) { int c; while ((c = fgetc(file)) != EOF) { putchar(c); // 逐个字符输出到屏幕 } } int main(int argc, char argv) { if (argc < 2) { // 无参数时,从键盘读取输入(Ctrl+D结束) print_file(stdin); } else { // 有参数时,逐个打开文件并打印 for (int i = 1; i < argc; i++) { FILE *file = fopen(argv[i], "r"); if (file) { print_file(file); fclose(file); } else { fprintf(stderr, "无法打开文件:%s\n", argv[i]); } } } return 0; }
总结表格
特性 |
说明 |
功能 |
逐个字符读取文件 |
适用场景 |
文本解析、加密解密、简单复制 |
性能 |
适合小文件,大文件建议用块读取 |
安全要点 |
必须检查EOF,用int类型接收返回值 |
总结
- 核心功能:逐个字符读取文件内容
- 必用场景:文本分析、字符级操作、教学演示
- 类比记忆:就像超市收银员扫描商品条形码,fgetc 是程序员从文件流中逐字符扫描的「字符扫描枪」
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/175754.html