ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者: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
この回答へのお礼この回答にお礼をつける(質問者のみ)
最新から表示回答順に表示良回答のみ表示