linux下,编写一个c语言程序实现...(详细见正文)!急!200分悬赏!

作者&投稿:壹林 (若有异议请与网页底部的电邮联系)
linux下,编写一个c语言程序实现...(详细见正文)!急!~

//没有统计功能,要的话再Hi我

/*
程序功能:查询IP
使用方法:
将IP库保存为c:\data.txt,将要查询的IP保存为c:\ip.txt;编译好本程序后,运行后产生c:esult.txt结果文件

程序BUG:data文件最后需要以两个换行结束

*/

#include
#include
#include
#include

#define TOTAL_INFO 100

extern void str_init(char* str1, char* str2, char* str3, char* str4); //字符串初始化函数
extern void str_init_total_info(char *str);
extern int read_file(FILE *fp, char *str); //读取IP
extern void read_dt2_next(FILE *fp, char *str); //单独保存数据库中第二IP段,最大IP范围
extern void next_line_data(FILE *fp); //专用:跳到下一行
extern void next_line_ip(FILE *fp);
extern int total_line(FILE *fp); //检测文件总行数


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

FILE *fp_data, *fp_ip, *fp_result;


char t_dt1[5], t_dt2[5], t_dt3[5], t_dt4[5];
char t_ip1[5], t_ip2[5], t_ip3[5], t_ip4[5]; //4个IP段,便于比较和保存
char t_dt2_next[5]; //保存数据库中同一行第二IP段,最大IP范围
char addr_ip[50]; //输出处理后的IP归属地
char temp;
char ip_total_info[30];

int flag_loop_ip=1, flag_loop_data=1;
int i=0, j=0, k=0, flag_complete=0;
int len_dt1, len_dt2;
int len_ip1, len_ip2;
int total_line_nu=0;

str_init(t_dt1, t_dt2, t_dt3, t_dt4); //初始化:将字符串以'\0'填充
str_init(t_ip1, t_ip2, t_ip3, t_ip4);
str_init_total_info(ip_total_info);

fp_data=fopen("c:\\data.txt", "r");
fp_ip=fopen("c:\\ip.txt", "r");
fp_result=fopen("c:\esult.txt", "a+"); //追加文件,若存在

total_line_nu=total_line(fp_ip); //获取ip.txt文件的总行数

fseek(fp_ip, 0, SEEK_SET); //将fp_ip移动到文件开头

for(i=0; i<total_line_nu; i++) //外层总循环,由ip.txt文件的总行数控制
{

flag_complete=0;

len_ip1=read_file(fp_ip, t_ip1);
len_ip2=read_file(fp_ip, t_ip2);
read_file(fp_ip, t_ip3);
read_file(fp_ip, t_ip4);

for(j=0; flag_complete == 0; j++) //内层总循环,控制条件:是否完成一次比较
{
len_dt1=read_file(fp_data, t_dt1); //读取各段IP,并保存各段IP长度
len_dt2=read_file(fp_data, t_dt2);
read_file(fp_data, t_dt3);
read_file(fp_data, t_dt4);

read_dt2_next(fp_data, t_dt2_next); //单独保存数据库中第二IP段,最大IP范围


fseek(fp_data,9,SEEK_CUR); //文件指针后移9位,指向汉字将要出现的地方

fgets(addr_ip, 20 , fp_data); //单独保存IP信息(汉字)


for(k=0; (temp=fgetc(fp_data)) != '
'; k++) //此处为了使主程序的内层循环自动换行
{

}


// fseek(fp_data,2,SEEK_CUR); //使fp_data指向下一行

// next_line(fp_data);


if(len_dt1==len_ip1 && len_dt2==len_ip2) //如果各段IP都一样长,则比较
{
if( !strcmp(t_dt1, t_ip1) ) //如果第一段的IP内容一样,比较第二段
{
if( ((strcmp(t_dt2, t_ip2)) = 0) )
{ //如果要查询IP在这个IP段(BUG为:最小范围和最大范围个数不一样)

flag_complete = 1; //完成一次循环


strcpy(ip_total_info,t_ip1); //整理要输出的信息
strcat(ip_total_info,".");
strcat(ip_total_info,t_ip2);
strcat(ip_total_info,".");
strcat(ip_total_info,t_ip3);
strcat(ip_total_info,".");
strcat(ip_total_info,t_ip4);
strcat(ip_total_info,"");
strcat(ip_total_info,addr_ip);

fputs(ip_total_info, fp_result);


fseek(fp_data, 0, SEEK_SET); //将fp_data移动到文件开头


}
}


}

//不满足条件时返回循环,因为readfile函数的设置,不用再重置到下一行


}



}






// printf("ftell:%d
",ftell(fp_data)); //获取文件流的读取位置

// fseek(fp,2,SEEK_CUR); //


fclose(fp_data);
fclose(fp_ip);
fclose(fp_result);
return 0;
}









void str_init(char *str1, char *str2, char *str3, char *str4)
{
int i;
for(i=0; i<5; i++)
{
str1[i]='\0';
str2[i]='\0';
str3[i]='\0';
str4[i]='\0';
}
}

///////////////////////////////////////////////////////////////////////////////////////////////////
int read_file(FILE *fp, char* str)
{
int i, len;
char t;

for(i=0; ( (str[i]=fgetc(fp)) >= '0') && (str[i] <= '9'); i++) //从文件中读取字符串,直到非数字结束
{
}

str[i] = '\0'; //将最后读取的非数字填充掉

len=strlen(str);
return len;

}

void read_dt2_next(FILE *fp, char *str) //单独保存数据库中第二IP段,最大IP范围
{
char temp;
int flag=0,i;

for (i=0; flag != 1; i++ ) //直到找到第二段最大范围IP
{
temp = fgetc(fp);
if(temp == '.') //第二段IP以第一段的.开始
{
flag = 1;
}
}

//保存找到的第二段最大范围IP
for(i=0; ( (str[i]=fgetc(fp)) >= '0') && (str[i] <= '9'); i++) //从文件中读取字符串,直到非数字结束
{
}

str[i] = '\0'; //将最后读取的非数字填充掉

}


void next_line_data(FILE *fp) //使文件指针指向下一行
{
char t;
t=fgetc(fp);
while(t != '
')
{
// printf("temp t:%c
", t);
// system("pause");

t=fgetc(fp);
}

t=fgetc(fp);
if (t != '
')
{
fseek(fp,-1,SEEK_CUR);
}
else
{
t=getc(fp);
if (t != '
')
{
fseek(fp,-1,SEEK_CUR);
}
}
//fseek(fp,4,SEEK_CUR); //精确定位到下下一行,因为两行之间有一个空白行
//t=fgetc(fp); //读取换行符,使文件指针指向下一行

}

void next_line_ip(FILE *fp) //使文件指针指向下一行
{
char t;
t=fgetc(fp);
while(t != '
')
{
// printf("temp t:%c
", t);
// system("pause");

t=fgetc(fp);
}
fseek(fp,2,SEEK_CUR); //精确定位到下下一行,因为两行之间有一个空白行
//t=fgetc(fp); //读取换行符,使文件指针指向下一行

}


int total_line(FILE *fp) //检测总行数
{
char t1, t2;
int flag=0, flag2=0;
t1 = fgetc(fp);
t2 = fgetc(fp);
while (t1 != EOF) //到达文件尾或出错返回EOF
{
if( (t1 == '
') && (t1=fgetc(fp) != EOF))
{
flag2=0;
flag+=1;
}
else flag2=1;

t1 = fgetc(fp);


}
flag=flag+flag2;
return flag;

}

void str_init_total_info(char *str)
{
int i;
for(i=0; i<TOTAL_INFO; i++)
{
str[i]='\0';
}
}

1、打开kali linux的终端。创建一个文件并命名为test.c。在终端输入:touch test.c。

2、可以看到已经生成了一个后缀为test.c的源文件。然后用vim工具打开这个文件并编写代码。在终端中输入:vim test.c或者gvim test.c打开这个文件并编写代码。

3、编写完了这个代码。现在开始编译源文件。在终端中输入:gcc test.cgcc是linux自带的c语言编译器。如果是windows则要用ide工具来编译。linux系统一般写C语言用gcc +vim+gdb三个自带的工具就可以了。

4、打完gcc test.c编译完C源文件。然后就可以看见a.out的文件。一般linux系统就默认为a.out为编译完的文件。现在运行a.out文件。在a.out文件的目录下打开终端并输入./a.out就是运行文件了。

5、如果想要编译完的文件名不要用a.out文件。就可以在编译时打入.gcc test.c -o test.out然后就可以看见有一个test.out.文件 了。-o后面跟着的编译生成的文件名。

6、再运行test.out在终端中输入./test.out结果如图。这样在linux系统下编译并运行C语言就完成了。

参考ln -l命令的输出结果,编写了以下程序(即输出结果和ls -l命令的输出结果相似),通过命令行传入要查看的目录,如果没有传入参数,则显出当前目录:

#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pwd.h>
#include <time.h>

char *getmod(mode_t mode,char *line) /*生成权限描述字符串*/
{
memset(line,0,sizeof(char)*11);

strcat(line,S_ISDIR(mode)?"d":"-");
strcat(line,(mode&S_IRWXU)&S_IRUSR?"r":"-");
strcat(line,(mode&S_IRWXU)&S_IWUSR?"w":"-");
strcat(line,(mode&S_IRWXU)&S_IXUSR?"x":"-");

strcat(line,(mode&S_IRWXG)&S_IRGRP?"r":"-");
strcat(line,(mode&S_IRWXG)&S_IWGRP?"w":"-");
strcat(line,(mode&S_IRWXG)&S_IXGRP?"x":"-");

strcat(line,(mode&S_IRWXO)&S_IROTH?"r":"-");
strcat(line,(mode&S_IRWXO)&S_IWOTH?"w":"-");
strcat(line,(mode&S_IRWXO)&S_IXOTH?"x":"-");

return line;
}
char *directory(char *argv) /*从程序参数取出目录*/
{
int i;
for (i=strlen(argv)-1;i;--i)
if (argv[i]=='/'){
argv[i+1]='\0';
break;
}
return argv;
}

int main(int argc,char *argv[])
{
DIR *dirp;
struct dirent *dirst;
struct stat finfo;
char *path,fname[512],mod[11],ctm[10];
struct passwd *user=NULL;
struct tm *ltm;

if (argc==1) path=directory(argv[0]);
else path=argv[1];

dirp=opendir(path);
if (!dirp)
{
fprintf(stderr,"ERROR\n");
exit(-1);
}

for (dirst=readdir(dirp);dirst;dirst=readdir(dirp))
{
strcpy(fname,path);

lstat(strcat(strcat(fname,"/"),dirst->d_name),&finfo);
user=getpwuid(finfo.st_uid);

printf("%s\t%10s\t",getmod(finfo.st_mode,mod),user->pw_name);
printf("%10d\t%9d\t",finfo.st_ino,finfo.st_size);
ltm=localtime(&finfo.st_mtime);
strftime(ctm,9,"%b",ltm);
printf("%5s",ctm);
strftime(ctm,9,"%d",ltm);
printf("%3s",ctm);
strftime(ctm,9,"%Y",ltm);
printf("%5s\t",ctm);
printf("%s\n",dirst->d_name);
}
closedir(dirp);
return 0;
}

最简单的方法,使用system函数,调用本来就有的命令ls
具体用法
#include <stdlib.h>
void main(){
char path[]="/";
char cmdline[1000];
sprintf(cmdline,"ls -l \"%s\"",path);
system(cmdline);
}

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <time.h>

int
main()
{
struct stat buf;
/*use octarray for determining if permission bits set*/
static short octarray[9] = {0400,0200,0100,0040,0020,0010,0004,0002,0001};
/*mnemonic codes for file permissions,10 chars long because of the terminating null*/
static char perms[10] = "rwxrwxrwx";
char descrip[10];
int j;
char *filename = "test";
char *ptr;

if(stat(filename,&buf) == -1)
{ fprintf(stderr,"Couldn't stat %s\n",filename);
exit(1);
}

/*check the file type*/
if (S_ISREG(buf.st_mode)) ptr = "regular";
else if (S_ISDIR(buf.st_mode)) ptr = "directory";
else if (S_ISCHR(buf.st_mode)) ptr = "character special";
else if (S_ISBLK(buf.st_mode)) ptr = "block special";
else if (S_ISFIFO(buf.st_mode)) ptr = "fifo";
#ifdef S_ISLINK
else if (S_ISLNK(buf.st_mode)) ptr = "symbolic link";
#endif
#ifdef S_ISSOCK
else if (S_ISSOCK(buf.st_mode)) ptr = "socket";
#endif
else ptr = "** unknown mode **";

/*put permissions into readable form*/
for(j = 0; j < 9; j++ )
{
/*test whether permission set using bitwise*/
if(buf.st_mode &octarray[j])
descrip[j] = perms[j];
else
descrip [j] = '-';
}
descrip[9] = '\0';/*make sure we've a string*/

/*display file niformation*/
printf("\nFile name: %s\n",filename);
printf("Type: %s\n",ptr);
printf("Size: %ld bytes.\n",buf.st_size);
printf("Permissions:%s\n",descrip);
printf("i-node number(serial number):%ld\n",buf.st_ino);
printf("Number of links:%d\n",buf.st_nlink);
printf("User-id: %d,Group-id: %d\n",buf.st_uid,buf.st_gid);
printf("Last-change time of i-node status:%s",ctime(&buf.st_ctime));
printf("Time of last modification:%s",ctime(&buf.st_mtime));
printf("Best I/O block size:%ld\n",buf.st_blksize);
printf("Number of 512-byte blocks allocated:%ld\n",buf.st_blocks);
exit(0);
}
下面是得到一个文件属性的函数,相当楼主看了就明白了:
//! 需要包含de头文件
#include <sys/types.h>
#include <sys/stat.h>

int stat(const char *filename, struct stat *buf); //! prototype,原型

struct stat
{
dev_t st_dev; /* ID of device containing file -文件所在设备的ID*/
ino_t st_ino; /* inode number -inode节点号*/
mode_t st_mode; /* protection -保护模式?*/
nlink_t st_nlink; /* number of hard links -链向此文件的连接数(硬连接)*/
uid_t st_uid; /* user ID of owner -user id*/
gid_t st_gid; /* group ID of owner - group id*/
dev_t st_rdev; /* device ID (if special file) -设备号,针对设备文件*/
off_t st_size; /* total size, in bytes -文件大小,字节为单位*/
blksize_t st_blksize; /* blocksize for filesystem I/O -系统块的大小*/
blkcnt_t st_blocks; /* number of blocks allocated -文件所占块数*/
time_t st_atime; /* time of last access -最近存取时间*/
time_t st_mtime; /* time of last modification -最近修改时间*/
time_t st_ctime; /* time of last status change - */
};

具体的代码就不写了,不过我可以告诉楼主如果想学linux C的话建议楼主看一本书--<<UNIX环境下的高级编程>>,此书相当经典!!在网上有PDF版本的


求教高手,编写一个linux下端口扫描程序
1-z选项指示nc仅扫描打开的端口,并不发送任何数据,并且-v用于获取更多详细信息。运行结果如下:sl@Li:~\/Works\/brochain\/corsac$ nc -z -v 192.168.8.51 4000-4004 Connection to 192.168.8.51 4000 port [tcp\/*] succeeded!nc: connect to 192.168.8.51 port 4001 (tcp) failed: Co...

怎样在linux中使用crontab编写一个定时任务,可以实现以下功能:
正斜线(\/):可以用正斜线指定时间的间隔频率,例如“0-23\/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*\/10,如果用在minute字段,表示每十分钟执行一次。8、在home目录下编写一个test.sh脚本,脚本功能是把\/home下ifcfg-eth0这个文本复制到\/mnt目录下。9、运行crontab –e 编写...

怎样在Linux下编程?需要什么技术?
熟悉常用的LinuxShell命令:这个是使用Linux的基础,像常见的ls,cd,find,mdkir,rm,top,grep,sed,awk,su等,简化版的Linux就只Terminal终端而已,如果你连基本的命令都不会,就不要想着还能操作Linux: 熟悉一下vim,emacs等编辑器的使用,可能在迷你版的Linux下,就只是一个vim编辑器,你所有的编程工作都只能在这个环境下...

linux下,编写一个c语言程序实现...(详细见正文)!急!200分悬赏!_百度知...
参考ln -l命令的输出结果,编写了以下程序(即输出结果和ls -l命令的输出结果相似),通过命令行传入要查看的目录,如果没有传入参数,则显出当前目录:include <unistd.h> include <sys\/stat.h> include <sys\/types.h> include <dirent.h> include <stdio.h> include <string.h> include <stdlib...

Linux 脚本编写 如何编写一个脚本,修改已有文件中的内容
1、第一步,打开命令控制台以找到要编辑的文件,执行命令ls来查看下面的一些文件,在下面有一个index.php文件,如下图所示。2、其次,完成上述步骤后,执行命令vi index.php,如下图所示。3、接着,完成上述步骤后,如果要修改此文件的内容,请按键盘上的“ i”键,底部将变为INSERT,就可以对其...

编写linux程序linux下编程
linux进入编程命令,不同的编程语言有不同的方法。如果你用的是C语言的话,可以打开一个编辑器,在里面写程序就可以了,当然,如果你习惯了WINDOWS的方式,你也可以在linux下面图形界面,然后在图形界面下进入编辑器就可以开始编程序了。另外,你还可以直接在命令行上写你的程序,把他输出到一个文件当中...

在Linux下用C语言编程
相反如果在Linux下编写一个"常驻内存"的程序却是很容易的.我们只要几行代码就可以做到. 实际上由于Linux是多任务操作系统,我们就是不编写代码也可以把一个程序放到后台去执行的.我们只要在命令后面加上&符号SHELL就会把我们的程序放到后台去运行的. 这里我们"开发"一个后台检查邮件的程序.这个程序每个一...

linux下,编写一个c语言程序实现...(详细见正文)!急!
int flag_loop_ip=1, flag_loop_data=1;int i=0, j=0, k=0, flag_complete=0;int len_dt1, len_dt2;int len_ip1, len_ip2;int total_line_nu=0;str_init(t_dt1, t_dt2, t_dt3, t_dt4); \/\/初始化:将字符串以'\\0'填充 str_init(t_ip1, t_ip2, t_ip3, t_ip4...

linux编写语言linux编写语言
方法\/步骤 1\/5 点击首选项 点击开始菜单上的首选项。2\/5 点击系统设置 点击首选项页面上的系统设置。3\/5 点击语言 点击右边的语言选项。4\/5 点击窗口上的语言 在弹出的窗口上点击语言选项。5\/5 选择中文 选择中文选项就可以了。linux编写c语言怎么打中文?在linux下用C语言写程序,可以设置中文环境...

linux的vim使用教程linux的vim使用
怎么在linux下用vim编写一个C程序?先终端输入 vimtest.c 车进入vim编辑器再按a键进入编辑状态输入C语言语句:include intmain(){ printf("helloworld!n");} 按esc键退编辑状态再输入冒号(shift+冒号号键)紧跟着输入wq即输入 :wq 按车即推vim编辑器终端命令窗口(类似xp命令提示符)输入 gcctest....

白云区17013171260: 在Linux系统中,如何运行一个C语言程序? -
荀恒凯宝: 我不太明白你说的是什么意思,Linux下的C编程一般是通过gcc实现的. 例如,创建了一个hello.c文本,在文本中写入 #include <stdio.h>int main(void){printf(“hello world!!”);return 0;}然后在终端输入$ gcc –o hello hello.c$ /tmp/hello 注:hello.c文件放在/tmp目录下,通过gcc -o hello hello.c命令生成一个hello文件,它是一个可执行文件,然后直接执行,就可以运行该程序了.

白云区17013171260: linux下,编写一个c语言程序实现...(详细见正文)!急! -
荀恒凯宝: 不知道你要提取到哪里,自作主张把提取出内容放入到txt文档中. 输入文件:in.txt 输出文件:out.txt 代码如下:已在GCC测试.#include int main(int argc, char *argv[]) { char buffer[32]; char *pos; FILE *fp_in = fopen("in.txt", "r"); FILE *fp_...

白云区17013171260: 在linux如何c语言编写程序. -
荀恒凯宝: linux终端下,编译C语言程序步骤为:采用vi进行源代码编写,编写完成后,:wq存盘退出,如:vi test.c 在命令行下,运行gcc编译程序,生成执行码,如:gcc -o test test.c-o 表示指明生成的执行码名称 运行编译后的执行码./test

白云区17013171260: 到底怎么在Linux里编写c程序啊? -
荀恒凯宝: 在linux下通常使用gedit或vim直接编写.c程序,然后通过gcc指令编译.以Ubuntu系统为例,详细过程如下: 1、进入桌面Temp文件夹 2、右键新建空白文件 3、将文件命名为hello.c 4、进入hello.c,开始编写代码(默认gedit为编辑器) ...

白云区17013171260: linux 下如何编写C程序
荀恒凯宝: linux下要用到GCC,比如源程序hello # gcc -o hello hello.c # ./hello以下网址有对GCC的详解: http://lveyo.javaeye.com/blog/240578

白云区17013171260: linux系统怎么c语言编程 -
荀恒凯宝: 比如编写一个C语言文件 1.cpp 【建议使用gedit,可以使用中文哦】 然后简单方法就是:g++ 1.cpp 然后./a.out 稍微麻烦点就是 g++ 1.cpp -o out./out

白云区17013171260: 在linux下,写一个c语言程序把一个文件的内容写入另一个文件中 -
荀恒凯宝: #include<stdio.h>main(){ FILE *fi,*fo; char c; fi=fopen("input","r"); fo=fopen("output","w"); while(fscanf(fi,"%c",&c)!=EOF) fprintf(fo,"%c",c); fclose(fi); fclose(fo);}

白云区17013171260: 在Linux下如何开发C程序? -
荀恒凯宝: 在Linux开发环境下,GCC是进行C程序开发不可缺少的编译工具.GCC是GNU C Compile的缩写,是GNU/Linux系统下的标准C编译器.虽然GCC没有集成的开发环境,但堪称是目前效率很高的C/C++编译器.《linux就该这么学》非常值得您一...

白云区17013171260: 怎样在Linux环境下编写C程序?谢谢!
荀恒凯宝: 相当简单,使用vi \vim等只要是文本编辑器就行.至于编译,使用GCC就行,应该是自带的.如果没有. yum install gcc 安装.

白云区17013171260: 如何在linux中运行c程序 -
荀恒凯宝: gcc first.C -o first 说明: 1>编译当前目录下、名字叫做first.C的c源文件; 2>在当前目录下、生成名字叫first(这个名字可以自己随便写、符合linux命名规则就行)的可执行程序;关于运行: 用ls -l 命令,可以看到当前目录下有一个绿色的文件、名字叫first,就是刚刚编译得到的文件; 使用命令“./first”既可运行(无双引号、双引号是用来说明的);

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网