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 を上書き */