當前位置:編程學習大全網 - 編程語言 - linux下,編寫壹個c語言程序實現...(詳細見正文)!急!

linux下,編寫壹個c語言程序實現...(詳細見正文)!急!

//沒有統計功能,要的話再Hi我

/*

程序功能:查詢IP

使用方法:

將IP庫保存為c:\data.txt,將要查詢的IP保存為c:\ip.txt;編譯好本程序後,運行後產生c:\result.txt結果文件

程序BUG:data文件最後需要以兩個換行結束

*/

#include <stdio.h>

#include <string.h>

#include <windows.h>

#include <stdlib.h>

#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:\\result.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)) != '\n'; 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) && ((strcmp(t_dt2_next, 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,"\t");

strcat(ip_total_info,addr_ip);

fputs(ip_total_info, fp_result);

fseek(fp_data, 0, SEEK_SET); //將fp_data移動到文件開頭

}

}

}

//不滿足條件時返回循環,因為readfile函數的設置,不用再重置到下壹行

}

}

// printf("ftell:%d\n",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 != '\n')

{

// printf("temp t:%c\n", t);

// system("pause");

t=fgetc(fp);

}

t=fgetc(fp);

if (t != '\n')

{

fseek(fp,-1,SEEK_CUR);

}

else

{

t=getc(fp);

if (t != '\n')

{

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 != '\n')

{

// printf("temp t:%c\n", 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 == '\n') && (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';

}

}

  • 上一篇:怎麽學編程,給些學步驟步驟和方法,比如像VB,c c++易語言,匯編語言,DELPHL,和JAVA
  • 下一篇:如何用c語言進行編輯運行和保存用那幾個命令
  • copyright 2024編程學習大全網