题目一:
编写一个程序,将当前系统中所有进程的PID、PPID、Name信息记录到record.txt。
注解:文件中/proc目录下,每个纯数字组成的文件夹就是一个进程,也是该进程的PID号。
一、思考过程
💡 初步想法:
打开目录(/proc)
遍历文件→找到纯数字的文件名字
→进如数字文件的status文件
→把里面内容分割找到目标内容,进行比对选出需要部分
→写进文件里
写时遇到的困难:
1.利用循环找纯数字文件时,不管达不达成目标,循环都得跳出。但跳出之后就无法分清哪个是我需要的文件。record.txt后续简称m文件。
-解1:循环都是一样,换for循环也解决不了
-解2: 尝试过想法封装函数,有想法,但是不太会畏惧就放弃了(这个简单,可学)☆
–解3:求助后,通过循环遇见数字cnt++,结束后比较cnt和strlen(文件名)的长度是否一致,判断是否为数字文件
2、字符串比较是否相同用到函数——strcmp(当值为0时表示字符串相同)
💡 更具有条例想法
题目的 目的就是要内容写到文件里,所以先打开文件,找到要写入文件的内容,写进去然后再关掉文件
具体实现如下:
1、在main函数中调用 “函数体主体”,传参传的是要生成的m文件名字
2、“函数体主体” 封装一个函数写要进去的内容,以及在里面调用如何找到要写的内容
3、函数体主函数:
打开m文件
→打开目录文件/proc
→读取目录找到目标目录名,调用函数①
(读目录时要过滤隐藏文件)
→如果是要的目标,便写进文件里调用函数②
(fprintf,可以实现多内容输入)
→结束关闭目录关闭文件
①封装一个找纯数字的文件(int型) (传参,传pp->d_name)
是,返回1
不是,返回0
②封装一个函数筛选找到该目标文件符合所要内容,写入m文件的内容(int型)
(传参,传字符数组,name,pid,name)
注意:返回值不能用指针返回,即使返回了指向的地址,函数体结束后,指向的地址内容就被回收了 →所以用strcop复制到形参指针中
二、实现过程
1、/proc文件

2、任意一个数字文件

3、status文件

每个name、pid、ppid位置是固定的
4、想法一:代码实现




- 结果

5、想法2代码实现




-结果

题目二:
找到并打印指定目录下( /home/linux/Music)下的音视频文件名 (加粗文件名)
目录下含有的文件: 1.mp3 2.mp4 3.avi 4.rmvb
5.flv 6.wma 7.txt helloworld howare 等...
一、思考实现过程
1、想法:
沿用题目一的第二种想法,用封装函数实现。
→打开要写入的m文件,‘r’
→打开指定目录,/home/linux/Music
→读取目录并遍历每个目录名
→判断是否是目标目录名(封装两个函数,1逻辑判断是否带“.”,2逻辑判断是否是所需的那六个)
→写入文件
→关闭文件、目录
2、代码实现
该代码实现打印在a.txt文件内
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/wait.h>
#include <pthread.h>
#include <errno.h>
int point_file(char *pointname)
{
int i = 0;
int len = 0;
len = strlen(pointname); //strlen不会改变指针指向
for (i = len-1; i >= 0; i--) //容易忽略了i会一直减下去,没设置跳出来的条件
{
if ('.' == pointname[i])
{
return 1;
}
}
return 0;
}
int compare_name(char *pointname)
{
char *tmpname = NULL;
char *aim[] = {".mp3",".mp4",".avi",".rmvb",".flv",".wma"};
//aim[6][32] = {...};这样不行,有越界风险
int i = 0;
while (*pointname != '.')
{
pointname++;
}
for (i = 0; i < 6; i++)
{
if(0 == strcmp(pointname,aim[i]))
{
return 1;
}
}
return 0;
}
//优化(下一个代码)
//如果让filename通过指针移动的话,上述两函数就可以写在一起了
//前一个找到点,后一个直接进行比较,而且若目录名不止有一个点的情况,也能找到最后一个
int find_music_filename(char *filename) //指针的原因:指针指向字符串数组的第一个元素
{
FILE *fp = NULL;
DIR *dp = NULL;
struct dirent *pp = NULL; //是让其为null空
fp = fopen(filename,"w");
if (NULL == fp)
{
perror("fail to fopen");
return -1;
}
dp = opendir("/home/linux/Music"); //是dp这个来表示
if (NULL == dp)
{
perror("fail to opendir");
return -1;
}
while (1)
{
pp = readdir(dp);
if (NULL == pp)
{
break;
}
if ('.' == pp->d_name[0])
{
continue;
}
if (point_file(pp->d_name))
{
if (compare_name(pp->d_name))
{
fprintf(fp,"%s\n",pp->d_name);
}
}
}
fclose(fp);
closedir(dp);
return 0;
}
int main(void)
{
find_music_filename("a.txt");
return 0;
}
该代码实现将文件打印在终端
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <math.h>
#include <dirent.h>
#include <sys/wait.h>
#include <pthread.h>
#include <errno.h>
int is_mediafile(char *pfilename)
{
char *ptmp = NULL;
ptmp = pfilename + strlen(pfilename);
while (ptmp >= pfilename && *ptmp != '.')
{
ptmp--;
}
if (0 == strcmp(ptmp, ".mp3") || 0 == strcmp(ptmp, ".mp4") || 0 == strcmp(ptmp, ".avi")
|| 0 == strcmp(ptmp, ".rmvb") || 0 == strcmp(ptmp, ".flv") || 0 == strcmp(ptmp, ".wma"))
{
return 1;
}
return 0;
}
int print_mediafile(char *pmediadir)
{
DIR *dp = NULL;
struct dirent *pp = NULL;
dp = opendir(pmediadir);
if (NULL == dp)
{
perror("fail to opendir");
return -1;
}
while (1)
{
pp = readdir(dp);
if (NULL == pp)
{
break;
}
if ('.' == pp->d_name[0])
{
continue;
}
if (is_mediafile(pp->d_name))
{
printf("%s\n", pp->d_name);
}
}
closedir(dp);
return 0;
}
int main(void)
{
print_mediafile("/home/linux/Music");
return 0;
}
1121

被折叠的 条评论
为什么被折叠?



