第98章 列挙したホストを保存する


前章のプログラムでは、せっかくホストを列挙してもプログラムが終了すると、跡形もなく消えてしまいました。今回は、これをファイルに保存できるように改良します。

保存してあったファイルを読み出せるようにします。 また、保存してあったファイルに、追加で書き足せるようにもします。



関数等で特に、目新しいものはありません。

では、プログラムを見てみましょう。(もちろんプロジェクトにWSock32.Libを参加させておきます)

/* ip02.c */

#include <stdio.h>
#include <winsock.h>

int gethost();
int mysave();
int myread();
int is_file = 0;
FILE *fp;

int main()
{
    WSADATA wsaData;
    char szAns[8];
    int loop = 1;//1:ループを回る 0:ループを出る

    WSAStartup(MAKEWORD(1, 1), &wsaData);
    while (1) {
        printf("------------------\n");
        printf("1.ホスト名の取得\n");
        printf("2.ファイルに保存\n");
        printf("3.ファイル読みだし\n");
        printf("0.終了\n");
        printf("------------------\n");
        printf("選択:");
        gets(szAns);
        switch (szAns[0]) {
            case '0':
                loop = 0;
                break;
            case '1':
                gethost();
                break;
            case '2':
                mysave();
                break;
            case '3':
                myread();
                break;
            default:
                printf("入力エラー\n");
                break;
        }
        if (loop == 0)
            break;
    }
    WSACleanup();
    return 0;
}
main関数では、単にメニューを表示させているだけです。
int gethost()
{
    char szIP3[256], szIPstart[16], szIPend[16], szIP[256], szEnd[16];
    HOSTENT *lpHost;
    int addr, n, i;

    printf("IPアドレス上位3バイト(例: 192.168.0)---");
    gets(szIP3);
    printf("開始IPアドレス下位1バイト(例: 1)---");
    gets(szIPstart);
    printf("終了IPアドレス下位1バイト(例: 10)--");
    gets(szIPend);

    n = atoi(szIPend) - atoi(szIPstart) + 1;

    if (n <= 0) {
        printf("指定が不正です\n");
        return -1;
    }

    for (i = 0; i < n; i++) {
        strcpy(szIP, szIP3);
        if (szIP3[strlen(szIP3)-1] != '.')
            strcat(szIP, ".");
        itoa(atoi(szIPstart) + i, szEnd, 10);
        strcat(szIP, szEnd);
        addr = inet_addr(szIP);
        lpHost = gethostbyaddr((char *)&addr, (int)sizeof(addr), AF_INET);
        if (lpHost == NULL) {
            printf("ホスト名取得失敗(%s)\n", szIP);
            continue;
        }
            printf("%s---%s\n", szIP, lpHost->h_name);
            if (is_file)
                fprintf(fp, "%s---%s\n", szIP, lpHost->h_name);
    }

    
    return 0;
}
これは、前章とほとんど同じですが、最後にis_fileが0でない時は、 fprintf関数でファイルに書き込んでいる点に注意してください。
int mysave()
{
    
    char szFileName[256];

    printf("保存するファイル名---");
    gets(szFileName);

    fp = fopen(szFileName, "a");
    if (fp == NULL) {
        perror("ファイルのオープンに失敗しました\n");
        return -1;
    }
    is_file = 1;
    gethost();
    fclose(fp);
    is_file = 0;

    return 0;
}
is_fileを1にしてgethost関数を呼び出しています。これで、ファイルに書き込めます。 書き込みが終わったらis_fileを0に戻しています。
int myread()
{
    char szFileName[256], buffer[64];

    printf("ファイル名----");
    gets(szFileName);
    fp = fopen(szFileName, "r");
    if (fp == NULL) {
        printf("ファイルのオープンに失敗しました\n");
        return -1;
    }
    while (fgets(buffer, 256, fp) != NULL) {
        printf(buffer);
    }
    fclose(fp);
    return 0;
}
ファイルの読み出しです。特にどうということもないですね。
[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Apr/04/2004 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。