• ベストアンサー

fgetsの改行について

fgetsで指定したファイル名のファイルを操作するプログラムの条件で、 ファイル名が入力されていない状態でエンターを入力した場合「ファイル名が未入力です」と出力してプログラムを終了させたいのですが、なぜか1行空行を挟んだ後に上記メッセージが出力されてしまいます(下記プログラム)空行を無くすにはどうすれば良いのでしょうか? これはfgetsに"\n"が含まれていることが問題なんでしょうか? if (!strcmp(filename, "\n")) { printf("ファイル名が未入力です。\n"); exit(1); }

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.5

要するに今回の話はfgets()とは何も関係なかった、ということですね。 printf()で出力するメッセージの最後に改行があるかないか、という話でした。

その他の回答 (4)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

> これはどうしようもないのでしょうか? はい。printf()の書式文字列に'\n'を含んでいる限り、 何が何でもそこで改行します。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

こういったことがしたいのでしょうか? #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; }

teru3128
質問者

補足

#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をつけたままだと空行が出来てしまいます。 これはどうしようもないのでしょうか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

その「挟んだ空行」は「ファイル名を入力するときに入れたエンターによるもの」ですか? もしそうなら, 普通はそうなりますね.

teru3128
質問者

補足

そうです。ファイル名を入力するときに入れたエンターによるものです。 その挟んだ空行をなくすにはどうすればよいのでしょうか?

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

例えば 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'を取り除くのであれば、そのためのコードを自分で書く必要があります。

関連するQ&A

専門家に質問してみよう