質問 |
||
| 質問者:teru3128 | fgetsの改行について | |
|---|---|---|
困り度:
|
fgetsで指定したファイル名のファイルを操作するプログラムの条件で、 ファイル名が入力されていない状態でエンターを入力した場合「ファイル名が未入力です」と出力してプログラムを終了させたいのですが、なぜか1行空行を挟んだ後に上記メッセージが出力されてしまいます(下記プログラム)空行を無くすにはどうすれば良いのでしょうか? これはfgetsに"\n"が含まれていることが問題なんでしょうか? if (!strcmp(filename, "\n")) { printf("ファイル名が未入力です。\n"); exit(1); } |
|
質問投稿日時:08/04/16 18:00 質問番号:3952596 |
||
回答良回答20pt |
|
| 回答者:asuncion | 要するに今回の話はfgets()とは何も関係なかった、ということですね。 printf()で出力するメッセージの最後に改行があるかないか、という話でした。 |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/04/16 23:37 回答番号:No.5 |
|
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| 回答者:asuncion | > これはどうしようもないのでしょうか? はい。printf()の書式文字列に'\n'を含んでいる限り、 何が何でもそこで改行します。 |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/04/16 23:35 回答番号:No.4 |
|
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| 回答者:asuncion | こういったことがしたいのでしょうか? #include <stdio.h> #include <string.h> int main(void) { char fn[80]; printf("ファイル名を入力してください:"); fgets(fn, 80, stdin); if (fn[strlen(fn)-1] == '\n') { fn[strlen(fn)-1] = '\0'; } if (fn[0] != '\0') { printf("ファイル名は'%s'です。\n", fn); } else { printf("ファイル名を入力しませんでしたね。\n"); } return 0; } |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/04/16 22:37 回答番号:No.3 |
|
| この回答への補足 | #pragma warning(disable : 4996) #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_NAME 256 #define MAX_BUF 256 int main(void) { FILE *rfp, *wfp; int len; char filename[MAX_NAME]; char buf[MAX_BUF]; printf( "ファイルを書き換えます。ファイル名を入力してください\n" ); fgets(filename, MAX_NAME - 1, stdin); len = strlen(filename); if (!strcmp(filename, "\n")) { printf("ファイル名が未入力です。\n"); return 1; } if ( filename[len - 1] == '\n' ) { filename[len - 1] = '\0'; } if ((rfp = fopen(filename, "r+" )) == NULL) { printf("ファイルが存在しないので新規作成します。\n"); // 読み込みファイルが存在しない場合 if ((wfp = fopen(filename, "w")) == NULL) { printf("ファイルがオープン出来ません。\n"); exit(1); } } printf("ファイル内容を書き換えて下さい。\n"); fgets(buf, MAX_BUF - 1, stdin); fprintf(wfp, "%s", buf); printf("更新完了\n"); fclose(rfp); fclose(wfp); } このようなファイルが存在しなければ、新規作成しファイル内容を書き換え、存在すればその内容を更新するといったプログラムなのですが、 どうやらprintf( "ファイルを書き換えます。ファイル名を入力してください\n" );の\nを削除するとうまく動くのですが、\nをつけたままだと空行が出来てしまいます。 これはどうしようもないのでしょうか? |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答良回答10pt |
|
| 回答者:Tacosan | その「挟んだ空行」は「ファイル名を入力するときに入れたエンターによるもの」ですか? もしそうなら, 普通はそうなりますね. |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/04/16 20:01 回答番号:No.2 |
|
| この回答への補足 | そうです。ファイル名を入力するときに入れたエンターによるものです。 その挟んだ空行をなくすにはどうすればよいのでしょうか? |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |
回答 |
|
| 回答者:asuncion | 例えば char s[10]; と定義してある状態で fgets(s, 10, stdin); と書いて標準入力からの入力を待つとします。そして、 abc<Enter> と入力したとします。すると、s[]の内容は次のようになります。 s[0]:'a' s[1]:'b' s[2]:'c' s[3]:'\n' s[4]:'\0' '\n'を取り除くのであれば、そのためのコードを自分で書く必要があります。 |
|---|---|
| 種類:アドバイス どんな人:一般人 自信:参考意見 |
|
| |
回答日時:08/04/16 19:54 回答番号:No.1 |
|
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |