fopenするファイルの拡張子を補う例を示す。 以下のプログラムは、データファイルとして開くファイル名をユーザに聞き、
.txt
をつけたファイル名
.dat
をつけたファイル名
の3つを順に試して、みつかったファイルを開くような仕組みのものである。
#include <stdio.h> #include <string.h> #define MAXNAME 1024 void debug(char *file) { fprintf(stderr, "Trying %s...\n", file); } int main() { char basename[MAXNAME], openfile[MAXNAME]; char txt[] = ".txt", dat[] = ".dat"; char buf[100]; int n; FILE *datafile; fprintf(stderr, "データファイルの名前は?: "); fgets(buf, sizeof buf, stdin); sscanf(buf, "%s", basename); debug(basename); /* 開こうとするファイル名をデバッグ表示 */ if (NULL == (datafile = fopen(basename, "r"))) { /* 入力した名前のファイルが開けなかったら */ /* いったんその名前を openfile にコピーして、 */ strlcpy(openfile, basename, sizeof openfile); /* ".txt" を追加してみる */ strlcat(openfile, txt, sizeof openfile); debug(openfile); if (NULL == (datafile = fopen(openfile, "r"))) { /* それでもだめなら */ strlcpy(openfile, basename, sizeof openfile); /* ".dat" を追加してみる */ strlcat(openfile, dat, sizeof openfile); debug(openfile); if (NULL == (datafile = fopen(openfile, "r"))) { fprintf(stderr, "データファイルを作っといてね\n"); exit(1); } } } for (n=0; fgets(buf, sizeof buf, datafile); n++) printf("%3d: %s", n, buf); fclose(datafile); }
入力した文字列の末尾の改行を切り取る処理は、strrchr
と
文字列ポインタを利用してもできる。
strchr
やstrrchr
で文字が見付かったときには、
その文字の位置(アドレス)が返るので、それをchar型のポインタ変数に入れておく。
たとえば、元の文字列 x が、
"http://hogehoge.jp"
だとして、この文字列の中に : (コロン)文字があるかどうか調べるときは、
if (strchr(x, ':')) { ... }
とするが、見付かった位置を捨ててしまわず、char型のポインタ変数にしまっ ておく。
char *p; 〜〜中略〜〜 p = strchr(x, ':'); if (NULL != p) { ... }
あるいはまとめて、
if (NULL != (p=strchr(x, ':'))) { ... }
のように書き、ifで条件がマッチしたブロック内で利用する。
これをふまえて末尾の改行を切り取る処理は、以下のようにも書くことがで きる。
char buf[10]; char *p; fprintf(stderr, "お名前は? "); fgets(buf, sizeof buf, stdin); if (NULL != (p=strrchr(buf, '\n'))) *p = '\0'; /* 改行文字の位置に \0 を上書き */