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の併用は相性が悪いと思ってください。 |