前章のプログラムでは、せっかくホストを列挙してもプログラムが終了すると、跡形もなく消えてしまいました。今回は、これをファイルに保存できるように改良します。保存してあったファイルを読み出せるようにします。 また、保存してあったファイルに、追加で書き足せるようにもします。
関数等で特に、目新しいものはありません。
では、プログラムを見てみましょう。(もちろんプロジェクトに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;
}
ファイルの読み出しです。特にどうということもないですね。
Update Apr/04/2004 By Y.Kumei