首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
testing
cmd
grid
range
settings
iostream
actionscrip
golang
express
数组
cSharp
cPlusPlus
replace
php
netty
text
javascript
config
httprequest
select
utf-8
uri
tree
version
list
plugins
less
yaml
jsp
erlang
input
fetch
cpython
shell
cookie
copy
schema
perl
web3
dagger
jar
emoji
expression
format
command
spring
heap
foreach
bit
node.js
include
keyword
object
char
controller
web
subset
buffer
hashcode
post
rsa
uml
httpclient
main
random
js
vbscript
java
filter
instance
flutter
go
python2
io
scala
future
header
timezone
bash
当前位置:
开发笔记
>
编程语言
> 正文
C写的实现wc和ls函数
作者:afagds | 来源:互联网 | 2023-05-17 10:51
以下是用linuxC写的实现wc功能的函数#include#defineBEGIN1;intmain(intargc,char*argv[]){intcharacters,
以下是用linux C写的实现wc功能的函数
#include
#define BEGIN 1;
int main(int argc, char *argv[])
{
int characters, lines, words, state;
char c;
state = characters = lines = words = 0;
while((c = getchar()) != '0') {
characters++;
if(c == '\n') {
lines++;
state = 0;
continue;
} else if(c == ' ') {
state = 0;
continue;
} else if(c == '\t') {
state = 0;
continue;
} else {
if(state == 0) {
state = BEGIN;
words++;
}
continue;
}
}
printf("%d characters. %d words. %d lines.\n", characters, words, lines);
}
以下是用linux C写的实现ls部分功能的函数。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//用lstat函数获取文件的类型
int get_mode(char *file)
{
struct stat buf;
char *ptr;
if(lstat(file, &buf) <0)
{
printf("error\n!");
}
switch(S_IFMT&buf.st_mode)
{
case S_IFREG:ptr = "-";break;
case S_IFDIR:ptr = "d";break;
case S_IFCHR:ptr = "c";break;
case S_IFBLK:ptr = "b";break;
case S_IFIFO:ptr = "f";break;
case S_IFLNK:ptr = "l";break;
case S_IFSOCK:ptr = "s";break;
default:ptr = "UNKNOW";
}
printf("%s", ptr);
return 0;
}
//用stat获取文件拥有者,用户组和其他组的权限
int get_rwx(char *file)
{
struct stat buf;
if(stat(file, &buf) == -1)
{
perror("stat \n");
return 0;
}
//文件拥有者的权限获取
if(S_IRUSR&buf.st_mode) {
printf("r");
} else {
printf("-");
}
if(S_IWUSR&buf.st_mode) {
printf("w");
} else {
printf("-");
}
if(S_IXUSR&buf.st_mode) {
printf("x");
} else {
printf("-");
}
//文件用户组的权限获取
if(S_IRGRP&buf.st_mode) {
printf("r");
} else {
printf("-");
}
if(S_IWGRP&buf.st_mode) {
printf("w");
} else {
printf("-");
}
if(S_IXGRP&buf.st_mode) {
printf("x");
} else {
printf("-");
}
//文件其他组的权限获取
if(S_IROTH&buf.st_mode) {
printf("r");
} else {
printf("-");
}
if(S_IWOTH&buf.st_mode) {
printf("w");
} else {
printf("-");
}
if(S_IXOTH&buf.st_mode) {
printf("x");
} else {
printf("-");
}
return 0;
}
//获取文件的大小
long get_size(char *file)
{
struct stat buf;
long n;
stat(file, &buf);
n = buf.st_size;
return n;
}
//获取文件的修改时间
int get_time(char *file, char *ch)
{
struct stat buf;
stat(file, &buf);
strcpy(ch, ctime(&buf.st_mtime));
ch[strlen(ch) - 1] = '\0';
return 0;
}
//文件的硬链接数目,并且打印出来
int get_nlink(char *file)
{
struct stat buf;
stat(file, &buf);
printf(" %d", buf.st_nlink);
return 0;
}
//获取文件拥有者和用户组的name
int get_name(char *file)
{
struct stat buf;
char name1[20], name2[20];
stat(file, &buf);
strcpy(name1, getpwuid(buf.st_uid)->pw_name);
strcpy(name2, getpwuid(buf.st_gid)->pw_name);
printf(" %s %s", name1, name2);
return 0;
}
//浏览文件夹的内容
struct dirent **scan_dir(int *n)
{
struct dirent **namelist;
(*n) = scandir(".", &namelist, 0, alphasort);
if ((*n) <0)
perror("scandir");
return namelist;
}
//实现ls不带参数的命令
int no_ls()
{
struct dirent **namelist;
int i, n;
long all_size = 0, size;
namelist = scan_dir(&n);
for(i = 0; i
if(namelist[i]->d_name[0] != '.') {
printf("%-s ", namelist[i]->d_name);
}
free(namelist[i]);
}
printf("\n");
free(namelist);
return 0;
}
//实现ls -l的命令
int l_ls()
{
struct dirent **namelist;
int n, i;
long all_size = 0, size;
char ch[40] = {0};
namelist = scan_dir(&n);
//得到文件总的大小
for(i = 0; i
if(namelist[i]->d_name[0] != '.') {
size = get_size(namelist[i]->d_name);
all_size += size;
}
}
//打印信息
printf("总用量:%ld\n", all_size);
for(i = 0; i
if(namelist[i]->d_name[0] != '.') {
get_mode(namelist[i]->d_name);
get_rwx(namelist[i]->d_name);
get_nlink(namelist[i]->d_name);
get_name(namelist[i]->d_name);
printf(" %5ld", get_size(namelist[i]->d_name));
get_time(namelist[i]->d_name, ch);
printf(" %s", ch);
printf(" %s", namelist[i]->d_name);
printf("\n");
}
free(namelist[i]);
}
free(namelist);
return 0;
}
//实现ls -al的命令
int al_ls()
{
struct dirent **namelist;
int n, i;
long all_size = 0, size;
char ch[40] = {0};
namelist = scan_dir(&n);
//得到文件总的大小
for(i = 0; i
size = get_size(namelist[i]->d_name);
all_size += size;
}
printf("总用量:%ld\n", all_size);
for(i = 0; i
get_mode(namelist[i]->d_name);
get_rwx(namelist[i]->d_name);
get_nlink(namelist[i]->d_name);
get_name(namelist[i]->d_name);
all_size += size;
printf(" %5ld", get_size(namelist[i]->d_name));
get_time(namelist[i]->d_name, ch);
printf(" %s", ch);
printf(" %s", namelist[i]->d_name);
printf("\n");
free(namelist[i]);
}
free(namelist);
return 0;
}
//实现ls -a的命令
int a_ls()
{
struct dirent **namelist;
int i, n;
namelist = scan_dir(&n);
for(i = 0; i
printf("%-s ", namelist[i]->d_name);
free(namelist[i]);
}
printf("\n");
free(namelist);
return 0;
}
//实现ls -A的命令
int A_ls()
{
struct dirent **namelist;
int i, n, test1, test2;
namelist = scan_dir(&n);
for(i = 0; i
test1 = strcmp(".", namelist[i]->d_name) == 0;
test2 = strcmp("..", namelist[i]->d_name) == 0;
if(test1 || test2){
free(namelist[i]);
continue;
}
printf("%-s ", namelist[i]->d_name);
free(namelist[i]);
}
printf("\n");
free(namelist);
return 0;
}
//浏览指定目录下的文件
int dir_ls(char *name)
{
struct dirent **namelist;
char file[20] = {0};
int i, n;
strcpy(file, "./");
strcat(file, name);
printf("%s\n", name);
n = scandir(file, &namelist, 0, alphasort);
for(i = 0; i
if(namelist[i]->d_name[0] == '.') {
free(namelist[i]);
continue;
}
printf("%-s ", namelist[i]->d_name);
free(namelist[i]);
}
printf("\n");
free(namelist);
return 0;
}
//实现多个输入文件时的输出name_ls
int name_ls(int argc, char **argv)
{
int i;
struct stat buf;
for(i = 1; i
if(lstat(argv[i], &buf) <0) {
perror("lstat:\n");
}
switch(S_IFMT&buf.st_mode) {
case S_IFDIR:dir_ls(argv[i]);break;
default:file_ls(argv[i]);
}
}
return 0;
}
//实现file_ls
int file_ls(char *file)
{
int fd;
struct stat buf;
if(lstat(file, &buf) <0) {
perror("lstat:\n");
return 0;
}
switch(S_IFMT&buf.st_mode) {
case S_IFDIR:dir_ls(file);return 0;
}
if((fd = open(file, O_RDONLY)) == -1) {
printf("没有找到%s文件!\n", file);
} else {
close(fd);
printf("%s\n", file);
}
return 0;
}
//实现mylist
int mylist(char *option)
{
if(strcmp(option, "-l") == 0) {
l_ls();
} else if(strcmp(option, "-al") == 0 || strcmp(option, "-la") == 0) {
al_ls();
} else if(strcmp(option, "-a") == 0) {
a_ls();
} else if(strcmp(option, "-A") == 0) {
A_ls();
} else {
file_ls(option);
}
return 0;
}
//主函数
int main(int argc, char *argv[])
{
if(argc == 1) {
no_ls();
} else if(argc == 2) {
mylist(argv[1]);
} else if(argc > 2) {
name_ls(argc, argv);
} else {
perror("Input error!\n");
}
return 0;
}
阅读(3795) | 评论(0) | 转发(1) |
0
上一篇:例析#define
下一篇:一个汉字真的由两个字节存放吗?
相关热门文章
欢迎icysky0605在ChinaUnix博...
欢迎xiaoniu02623在ChinaUnix...
欢迎禹诺在ChinaUnix博客安家!...
欢迎lenswolf在ChinaUnix博客...
欢迎qjy133456在ChinaUnix博客...
linux 常见服务端口
xmanager 2.0 for linux配置
【ROOTFS搭建】busybox的httpd...
openwrt中luci学习笔记
什么是shell
linux dhcp peizhi roc
关于Unix文件的软链接
求教这个命令什么意思,我是新...
sed -e "/grep/d" 是什么意思...
谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
linux
include
int
main
char
get
文件
struct
case
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
default
clone的fork与pthread_create创建线程有何不同
本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ...
[详细]
蜡笔小新 2023-12-12 20:00:06
settings
使用eclipse创建一个Java项目的步骤
本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ...
[详细]
蜡笔小新 2023-12-11 10:24:49
list
单页面应用 VS 多页面应用的区别和适用场景
本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ...
[详细]
蜡笔小新 2023-12-10 19:31:50
list
解决mysql 5.1启动问题的方法
本文介绍了解决mysql 5.1启动问题的方法,通过修改my.ini文件中的相关配置,包括innodb_data_home_dir和skip-innodb等,可以解决启动问题。同时还介绍了如何调整内存池来存储metadata信息。 ...
[详细]
蜡笔小新 2023-12-09 21:14:55
less
微软头条实习生分享深度学习自学指南
本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ...
[详细]
蜡笔小新 2023-12-14 20:58:32
list
C#学习教程:在Console中工作但在Windows窗体中不工作的异步代码分享
本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ...
[详细]
蜡笔小新 2023-12-14 15:56:00
plugins
在Windows 8上安装gvim中的插件的错误加载问题
本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ...
[详细]
蜡笔小新 2023-12-14 14:44:00
plugins
Java工具类库Hutool介绍及功能概述
本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ...
[详细]
蜡笔小新 2023-12-14 14:29:36
plugins
Webmin远程命令执行漏洞复现及防护方法
本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ...
[详细]
蜡笔小新 2023-12-13 16:14:53
config
HDFS2.x新特性
一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ...
[详细]
蜡笔小新 2023-12-13 13:52:40
php
Windows操作系统的版本介绍及特点
本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ...
[详细]
蜡笔小新 2023-12-12 17:41:13
version
mac php错误日志配置方法及错误级别修改
本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ...
[详细]
蜡笔小新 2023-12-12 11:59:08
list
MFC动态创建窗口的实现方法及注意事项
本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ...
[详细]
蜡笔小新 2023-12-11 15:09:27
php
操作系统的定义和功能
本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ...
[详细]
蜡笔小新 2023-12-11 14:17:13
replace
如何使用readlink获取文件的完整路径?
本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ...
[详细]
蜡笔小新 2023-12-09 17:28:17
afagds
这个家伙很懒,什么也没留下!
Tags | 热门标签
testing
cmd
grid
range
settings
iostream
actionscrip
golang
express
数组
cSharp
cPlusPlus
replace
php
netty
text
javascript
config
httprequest
select
utf-8
uri
tree
version
list
plugins
less
yaml
jsp
erlang
RankList | 热门文章
1
linux入门退出进入,进入与退出Linux入门命令
2
针式EPSONLQ630K打印机,我想用三联1/2型号的纸怎么设置?
3
day01RHCSA
4
cad画确定尺寸的矩形,cad怎么画尺寸矩形
5
开发管理_DevOps使用教程 华为云工作项 新建Bug 缺陷管理 开发管理 进度管理
6
双碳时代主题下,冷板液冷真的是空中楼阁么?
7
数学的回忆(二)——麦克斯韦方程
8
湘江集团 X Smartbi:打破数据壁垒,工作效率大幅提升
9
藏宝阁游戏服务器维护中,梦幻西游2013年1月22日藏宝阁维护公告 17173.com网络游戏:《梦幻西游》专区...
10
电脑怎么弄成网吧系统?
11
hi3531的时钟系统 分类: arm-linux-Ubuntu HI3531 2013-12-14 08:55 1067人阅读 评论(2) 收藏
12
迫于强迫,出一些电子杂物
13
支付宝服务窗怎么设置?
14
刀片服务器经销商
15
在Ubuntu下运行PQUIC
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有