在C语言中,可以通过标准文件I/O函数手动实现一个类似Unix命令 cat 的功能
创始人
2025-04-24 22:18:24

在C语言中,可以通过标准文件I/O函数手动实现一个类似Unix命令 cat 的功能(即读取文件内容并输出到标准输出)。以下是完整的实现步骤和代码示例:

实现步骤

打开文件:使用 fopen() 以只读模式打开目标文件。

检查文件是否成功打开:如果 fopen() 返回 NULL,说明文件打开失败(如文件不存在或无权限)。

逐字符/逐行读取文件内容:

使用 fgetc() 逐字符读取,或 fgets() 逐行读取。

输出内容到标准输出:使用 putchar() 或 fputs() 输出读取的内容。

关闭文件:使用 fclose() 释放资源。

处理命令行参数:从用户输入获取文件名。

代码示例:逐字符读取实现 cat

c

#include <>

#include

// 自定义cat函数:读取文件内容并输出到标准输出

void cat(const char *filename) {

FILE *file = fopen(filename, "r"); // 打开文件(只读模式)

if (file == NULL) {

perror("Error opening file"); // 打印错误信息(如文件不存在)

exit(EXIT_FAILURE);

}

int ch;

while ((ch = fgetc(file)) != EOF) { // 逐字符读取,直到文件末尾

putchar(ch); // 输出字符到标准输出

}

fclose(file); // 关闭文件

}

int main(int argc, char *argv[]) {

if (argc != 2) { // 检查命令行参数

fprintf(stderr, "Usage: %s \n", argv[0]);

return EXIT_FAILURE;

}

cat(argv[1]); // 调用cat函数处理用户指定的文件

return EXIT_SUCCESS;

}

代码说明

fopen()

打开文件,模式为 "r"(只读)。

如果失败,perror() 会打印类似 "Error opening file: No such file or directory" 的错误信息。

fgetc() + putchar()

fgetc() 每次读取一个字符,直到返回 EOF(文件结束)。

putchar() 将字符输出到标准输出。

命令行参数

程序期望用户输入一个文件名(如 ./my_cat example.txt)。

如果未提供文件名或参数数量错误,程序会提示用法。

扩展功能:逐行读取实现 cat

如果需要按行读取文件(例如支持大文件或需要处理换行符),可以用 fgets() 替代 fgetc():

c

#include

#include

void cat(const char *filename) {

FILE *file = fopen(filename, "r");

if (file == NULL) {

perror("Error opening file");

exit(EXIT_FAILURE);

}

char buffer[1024]; // 定义缓冲区存储一行内容

while (fgets(buffer, sizeof(buffer), file) != NULL) { // 逐行读取

fputs(buffer, stdout); // 输出行到标准输出

}

fclose(file);

}

int main(int argc, char *argv[]) {

if (argc != 2) {

fprintf(stderr, "Usage: %s \n", argv[0]);

return EXIT_FAILURE;

}

cat(argv[1]);

return EXIT_SUCCESS;

}

关键区别

逐字符 vs 逐行:

fgetc():适合小文件或需要精细控制字符的场景。

fgets():适合大文件或需要按行处理的场景(如统计行数、过滤内容)。

编译与运行

编译代码:

bash

gcc my_cat.c -o my_cat

运行程序:

bash

./my_cat example.txt # 输出example.txt的内容

高级功能扩展

如果需要实现类似Unix cat 的全部功能(如合并多个文件、显示行号、处理二进制文件等),可以进一步扩展:

支持多个文件:遍历 argv 数组,依次处理每个文件。

显示行号:在输出时增加行号计数器。

二进制模式:使用 fread() 和 fwrite() 避免字符转换问题。

总结

核心函数:fopen()、fgetc()/fgets()、putchar()/fputs()、fclose()。

错误处理:始终检查文件操作函数的返回值。

资源管理:确保文件在使用后关闭。

通过这种方式,你可以完全用C语言实现一个功能完整的 cat 工具!

⚠️
本网站信息内容及素材来源于网络采集或用户发布,如涉及侵权,请及时联系我们,发送链接至2697952338@QQ.COM,我们将第一时间进行核实与删除处理。

相关内容

热门资讯

河南宸邦数据技术有限公司意向合... 本文旨在进行投资风险教育,不针对任何特定企业。以下案例为拟情景,如有雷同纯属巧合!随着互联网金融的蓬...
河南宸邦长富数据技术有限公司申... 本文旨在进行投资风险教育,不针对任何特定企业。以下案例为拟情景,如有雷同纯属巧合!当“成为服务代理商...
致远老师直播间认购河南宸邦数据... 本文旨在进行投资风险教育,不针对任何特定企业。以下案例为拟情景,如有雷同纯属巧合!在投资市场中,不少...
和众汇富石昊楠1980靠谱吗?... 和众汇富石昊楠1980靠谱吗?收费荐股就是陷阱,多名股民实测退费成功!投资有风险,投资需谨慎!针对网...
河南宸.邦数据技术有限公司启动... 本文旨在进行投资风险教育,不针对任何特定企业。以下案例为拟情景,如有雷同纯属巧合!随着互联网金融的蓬...
万隆投顾收费荐股怎么样?202... 万隆投顾收费荐股怎么样?2026年用退费方法公布 广州万隆证券不正规!推荐股票一直亏损如何退还服务费...
筑梦人讲堂直播间赵东交流圈推荐... 本文旨在进行投资风险教育,不针对任何特定企业。以下案例为拟情景,如有雷同纯属巧合。 “原始股”三个字...
顶,点财经柯友浪荐股可靠吗? ...   投资有风险,投资需谨慎!针对网上素未谋面的网友、网上老师推荐网上投资理财、炒期货的、做外汇的、炒...
四川大决策退费收30%合法么?... 四川大决策退费收30%合法么?维权退款选正规渠道,线上办结,无需跑腿奔波! 投资有风险,投资需谨慎!...
广东盈泰证券秦老师联合竞标中签... 本文旨在进行投资风险教育,不针对任何特定企业。以下案例为拟情景,如有雷同纯属巧合。 “原始股”三个字...
小鹅通直播间认购河南宸.邦数据... 本文旨在进行投资风险教育,不针对任何特定企业。以下案例为拟情景,如有雷同纯属巧合!当“成为服务代理商...
河南宸.邦数据技术智能设备服务... 本文旨在进行投资风险教育,不针对任何特定企业。以下案例为拟情景,如有雷同纯属巧合!随着互联网金融的蓬...
河南宸邦数据技术有限公司能兑现... 本文旨在进行投资风险教育,不针对任何特定企业。以下案例为拟情景,如有雷同纯属巧合!对于渴望通过炒股实...
北京和众汇富科技的费用真的可以... 北京和众汇富科技的费用真的可以退费吗?收费荐股就是陷阱,多名股民实测退费成功!投资有风险,投资需谨慎...
先锋商学院周老师推荐河南宸.邦... 本文旨在进行投资风险教育,不针对任何特定企业。以下案例为拟情景,如有雷同纯属巧合!随着互联网金融的蓬...
河南宸.邦数据技术智能设备服务... 本文旨在进行投资风险教育,不针对任何特定企业。以下案例为拟情景,如有雷同纯属巧合!当“成为服务代理商...
河南宸邦数据委托承租江苏时代算... 本文旨在进行投资风险教育,不针对任何特定企业。以下案例为拟情景,如有雷同纯属巧合。 “原始股”三个字...
九方智投交了学费能退吗?合法合... 九方智投交了学费能退吗?合法合规理性维权,稳妥追回炒股服务费用! 投资有风险,投资需谨慎!针对网上素...
四川大决.策会员费给退吗? 投...   投资有风险,投资需谨慎!针对网上素未谋面的网友、网上老师推荐网上投资理财、炒期货的、做外汇的、炒...
河南宸联网络技术服务有限公司多... 本文旨在进行投资风险教育,不针对任何特定企业。以下案例为拟情景,如有雷同纯属巧合!在投资市场中,不少...
家族茶话会股票群认购河南宸邦数... 本文旨在进行投资风险教育,不针对任何特定企业。以下案例为拟情景,如有雷同纯属巧合!对于渴望通过炒股实...
博众投资服务要能退吗?投顾荐股... 博众投资服务要能退吗?投顾荐股骗局拆解,手把手教你合规退费回款!投资有风险,投资需谨慎!针对网上素未...
先锋商学院私董会周聪河南宸.邦... 本文旨在进行投资风险教育,不针对任何特定企业。以下案例为拟情景,如有雷同纯属巧合!对于渴望通过炒股实...
致远联盟直播间认购河南宸邦数据... 本文旨在进行投资风险教育,不针对任何特定企业。以下案例为拟情景,如有雷同纯属巧合。 “原始股”三个字...
河南宸联网络技术服务有限公司股... 本文旨在进行投资风险教育,不针对任何特定企业。以下案例为拟情景,如有雷同纯属巧合!在投资市场中,不少...