保存してあったファイルを読み出せるようにします。 また、保存してあったファイルに、追加で書き足せるようにもします。
関数等で特に、目新しいものはありません。
では、プログラムを見てみましょう。(もちろんプロジェクトに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