C言語関係掲示板

過去ログ

No.1258 ファイル名の入力

[戻る] [ホームページ]
No.16596

ファイル出力に関して質問
投稿者---teatime(2004/09/05 16:47:21)


ファイルに書き込みを行う際、新規ファイル名(拡張子を除く)を入力して作成させたいのですがどのような方法があるか教えてください。


No.16598

Re:ファイル出力に関して質問
投稿者---Sciggepy(2004/09/05 17:13:40)


fgetsでファイル名の入力を要求します。

fn[_MAX_PATH];
printf("ファイル名: ");
fgets(fn,_MAX_PATH+1,stdin);
fn[strlen(fn)]='\0';



No.16599

Re:ファイル出力に関して質問
投稿者---monkey(2004/09/05 18:04:27)


ケアレスミスとは思いますが...
    char fn[ MAX_PATH ];
    printf( "ファイル名: " );
    fgets( fn, MAX_PATH, stdin ); // 第2引数にはバッファサイズを指定
    fn[ strlen(fn) - 1 ] = '\0';  // 改行文字'\n'を考慮して'-1'する

それから、'_'(アンダースコア)から始まる識別子は処理系の予約語に使われますので、ユーザーは使わない方が無難です。


No.16600

Re:ファイル出力に関して質問
投稿者---Sciggepy(2004/09/05 20:23:59)


    fgets( fn, MAX_PATH, stdin ); // 第2引数にはバッファサイズを指定
MAX_PATHはwindef.hで定義されていたのですが、Windows以外でも使えるのでしょうか?

    fn[ strlen(fn) - 1 ] = '\0';  // 改行文字'\n'を考慮して'-1'する
これは私のミスです。




No.16601

Re:ファイル出力に関して質問
投稿者---YuO(2004/09/05 20:30:15)


> MAX_PATHはwindef.hで定義されていたのですが、Windows以外でも使えるのでしょうか?

使えません。
ファイル名長に限界があるシステムでは,FILENAME_MAXがファイル名の限界値になります。
ファイル名長に限界がないシステムの場合,
FILENAME_MAXはバッファの推奨される大きさとなります。



No.16603

Re:ファイル出力に関して質問
投稿者---monkey(2004/09/05 20:48:34)


>>    fgets( fn, MAX_PATH, stdin ); // 第2引数にはバッファサイズを指定
> MAX_PATHはwindef.hで定義されていたのですが、
> Windows以外でも使えるのでしょうか?

MAX_PATHはユーザー定義のマクロ(整数リテラルに展開される)のつもりでした。
windef.hで定義されているとすれば、この名前も避けた方が良いですね。
失礼しました。




No.16602

Re:ファイル出力に関して質問
投稿者---teatime(2004/09/05 20:44:52)


申し訳ありません、言葉が足りていなかったようです。

たとえば、日付などをyyyymmdd(任意)と入力し、拡張子の部分は.txtと一定とします。
このとき、yyyymmddの部分だけを入力させ、yyyymmdd.txtというファイルを出力(作成)するための方法をお聞きしたかったのですが・・


No.16604

Re:ファイル出力に関して質問
投稿者---monkey(2004/09/05 20:56:45)


文字列を連結する標準ライブラリ関数のstrcatが使えます。
例えば、先ほどのようにfgetsで入力した文字列がfnに設定された後で、次のようにします。
    strcat( fn, ".txt" );
    printf( "%s\n", fn );



No.16608

Re:ファイル出力に関して質問
投稿者---teatime(2004/09/06 00:08:12)



printf("日付を入力");
fgets( date, _MAX_PATH, stdin);
date[ strlen(date) - 1 ] = '\0';
printf("\n");
printf("項目Aを入力");
scanf("%s", a);
printf("\n");
printf("項目Bを入力");
scanf("%s", b);
printf("\n");
strcat( date, ".csv" );
fp = fopen(date, "a");
printf("\n");
fprintf(fp, date);
fprintf(fp, ",");
fprintf(fp, a);
fprintf(fp, ",");
fprintf(fp, b);
fclose(fp);


上記のようにしたところ、fgetsが読み込まれませんでした。どのようにすればよいのでしょうか。


No.16610

Re:ファイル出力に関して質問
投稿者---monkey(2004/09/06 00:15:39)


「fgetsが読み込まれない」とは、どのような現象でしょうか?
また、その現象が生じているということをどのようにして確認なさったのでしょうか?


No.16611

Re:ファイル出力に関して質問
投稿者---teatime(2004/09/06 00:52:48)


>「fgetsが読み込まれない」とは、どのような現象でしょうか?
>また、その現象が生じているということをどのようにして確認なさったのでしょうか?

printf("日付を入力");
fgets( date, _MAX_PATH, stdin);
date[ strlen(date) - 1 ] = '\0';
printf("\n");
printf("項目Aを入力");

としていますが、「日付を入力」と出力された後で入力待機を飛ばして「項目Aを入力」と表示されてしまいます。
つまり
fgets( date, _MAX_PATH, stdin);
date[ strlen(date) - 1 ] = '\0';
の2行がない状態と同じになってしまうのですが。


No.16612

Re:ファイル出力に関して質問
投稿者---あかま(2004/09/06 02:09:21)


>printf("日付を入力");
の前にscanfがありませんか?
詳しいことは↓で。
http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-4



No.16613

Re:ファイル出力に関して質問
投稿者---teatime(2004/09/06 02:30:26)


>>printf("日付を入力");
>の前にscanfがありませんか?

whileとifを使ってループさせてはいるのですが、
if(n==1){
とした後すぐに
printf("日付を入力");
となっています。対処法を教えてください。


No.16615

Re:ファイル出力に関して質問
投稿者---あかま(2004/09/06 03:41:58)


>whileとifを使ってループさせてはいるのですが、
>if(n==1){
>とした後すぐに
>printf("日付を入力");
>となっています。対処法を教えてください。
直前だけではなく、fgetsの前にscanfが一度でも実行されていたならアウトです。

fgets( date, _MAX_PATH, stdin);
date[ strlen(date) - 1 ] = '\0';
の2行を
scanf("%s",date);
に直してみてください。
もしくはリンク先の対処法を試してみてください。
scanfとfgetsの併用は相性が悪いと思ってください。