• ベストアンサー

fgetsの改行について

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

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

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

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

その他の回答 (4)

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

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

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答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% (2126/6288)
回答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

  • C言語、ファイル操作、fgets()について

    次のプログラムは入力された行を読み込み、コマンドラインで指定されたファイルに書き込みます。 空白行が入力されたら、入力の終了とみなしてファイルを閉じます。続いてファイルを入力用に開き、 fgets()を使ってファイルの内容を表示するものです。 (ソースコードが長くてすみません) #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fp; char str[80]; /* コマンドライン引数を検査する */ if(argc!=2) { printf("ファイル名を指定してください\n"); exit(1); } /* 出力用にファイルを開く */ if((fp = fopen(argv[1], "w"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } printf("終了するには空白行を入力してください\n"); do { printf(": "); gets(str); strcat(str, "\n"); /* 改行を追加する */ if(*str != '\n') fputs(str, fp); } while(*str != '\n'); fclose(fp); /* 入力用にファイルを開く */ if((fp = fopen(argv[1], "r"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } /* ファイルを読み込み直す */ do { fgets(str, 79, fp); if(!feof(fp)) printf(str); } while(!feof(fp)); fclose(fp); return 0; } 【質問】fgets()内のint型の数値「79」がどうして79なのかが分かりません。     80でも良いような気がするのですが・・・

  • gets fgetsについて

    対話式のプログラムを作成したのですが、fgetsのところで勝手に文字が入力されてるような処理になってしまい、こちら側から入力できません。 fgetsのところで通常通り入力できるようにするにはどうしたら良いのでしょうか? コードは以下のとおりです。 #include <stdio.h> #include <string.h> main() { int kazu; char sentaku[1]; char string[10]; printf("文字を入力してください\n"); /*文字入力要求のメッセージ*/ fgets(sentaku,1,stdin); /*確認時にenterを読み込まないようにfgetsで文字取得*/ sscanf(sentaku,"%d",&kazu); putchar(sentaku[1]); /*putcharを使ってmojiを画面出力*/ putchar('\n'); /*改行コードを出力*/ printf("ここから先に進みますか?-Y/N->\n"); fgets(sentaku,1,stdin); /*確認時にenterを読み込まないようにfgetsで対話する*/ sscanf(sentaku,"%d%",&kazu); if(sentaku[0]==121) /*入力した文字がyだった場合*/ { strcpy(string,"spring\n"); /*strcpyを使って変数に代入*/ putchar(string[0]); /*putcharを使って画面出力*/ putchar(string[1]); putchar(string[2]); putchar(string[3]); putchar(string[4]); putchar(string[5]); } }

  • 改行を読み飛ばす

    以下のようなファイルを読み込みたいのですが…. -------------------------------------------------- あいうえを かきくけこ さしすせそ たちつてと -------------------------------------------------- のように1行文字列があって,1行空白行(改行のみ)があって…のような繰り返しのファイルなんですが,空白行を読み飛ばして続けて -------------------------------------------------- あいうえお かきくけこ さしすせそ たちつてと -------------------------------------------------- のように表示させる場合はどのように書いたらよいですか? -------------------------------------------------- while(fgets(str,256,fpin)){   if(strcmp(str,"\n")!=0){    printf("%s\n",str);   } } -------------------------------------------------- と書いたのですが,空白行も表示されてしまいます. 何か間違えているでしょうか? それとも実はファイルの空白行は改行じゃないとかでしょうか?

  • fgetsでファイルの内容を読み込む

    キーボードから読みたいファイル名を入力し 指定した行数だけファイルの内容を出力する プログラムを作りました。 ちゃんと動作するソースは作れたのですが、 へんなところ(無駄な文など)がないか どなたか見て頂けないでしょうか。 ソースが長くて申し訳ありません。 課題で、答えはあるのですが、ソースを チェックしてもらえる人が回りに いない状況です。 どうぞ宜しくお願いします。 printf("出力するファイル名を入力してください-->"); gets(s); while((fp = fopen(s, "r")) == NULL) { printf("指定されたファイルがありません\n"); printf("再度入力して下さい-->"); fflush(stdin); gets(s); } printf("出力する行数を入力して下さい-->"); fflush(stdin); scanf("%d",&l); while(fgets(s, 256, fp)!=NULL){ printf("%s", s); l--; if(l==0){ fclose(fp); return 0; } } fclose(fp);

  • このプログラムの解説を

    C言語の勉強を始めたのですが、質問があります。 下のプログラムをコンパイルしたら   入力ファイル名= と出ますが、これは何を入力すればよいのでしょうか? 何か入力しても「~がオープンできません」と表示されて、これは、自分が持っているファイルを打てばよいのですか?(このプログラム自体も何を意味しているか、まだ理解できていません。) 解説よろしくお願いします。 #include<stdio.h> #include<stdlib.h> main() { FILE *fin; char buf[256]; char filename1[20]; printf("入力ファイル名="); gets(filename1); fin=fopen(filename1,"r"); if(fin==NULL){ printf("%sがオープンできません.\n",filename1); exit(1); } while(fgets(buf,256,fin) !=NULL){ printf("%s",buf); } fclose(fin); }

  • ファイルが開かない

    こんにちは、最近C言語の入門書を読み とあるプログラムをつくったのですが、思ったようになりません。 そのプログラムは typ1 という名前でこのようになっています。 #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fin; char buf[256]; char filename[80]; printf("入力ファイル名を指定してください="); gets(filename); fin = fopen("filename", "r"); if(fin == NULL) { printf("%sをオープンできません\n", filename); exit(1); } while(fgets(buf, 256, fin) != NULL){ printf("%s", buf); } fclose(fin); return 0; } となっており、プログラムを起動して指定したファイルを読み込んで、その内容を画面に出力するというものです。読み込み用ファイル(名前はsmp1)はメモ帳でつくっており、内容はアルファベットを一行目に、1から9の数字を二行目に書いて、アプリケーションのtyp1.exeがあるDebugというディレクトリと同じ場所に保存しております。 このプログラムはVisual Studio net 2003で作っおり エラー等はなく正常に動くのですが読み込むファイル(この場合smp1)を指定しても 入力ファイル名を指定してください=smp1.txt smp1.txtをオープンできません。 Press any key to continue となってしまいます。  読み込み用ファイルの場所が適切ではないのでしょうか? どなたか教えてください。

  • C言語のファイル読み込みに関して。

    英文を入力したテキストファイルを読み込むプログラムをつくっているのですが、 ファイル読み込みが上手くできません。 #include<stdio.h> main() { char filename[33]; char sty[512]; FILE *fp; printf("FILENAME: "); fgets(filename, 33, stdin); //読み込むテキストファイルを指定 fp = fopen(filename,"r"); if(fp == NULL){ printf("Can't open the file!\n"); return -1; } fgets(sty, 512, fp); fclose(fp); printf("%s\n",sty); } このプログラムなのですが、どうしても"Can't open the file!"が表示されてしまいます。 どうすればいいのでしょうか?

  • C言語の問題

    選んだファイルのデータを読み取り、そのファイルのデータの中の文字列を数えるプログラム(例えば、「I like sport」 だったら3ワード)を作りたいのですが、文字数を数えるものしかわからないです。 一応、下のプログラムが文字数を数えるものですが、どうすれば文字列を数えるものになりますでしょうか?教えてください。 #include <stdio.h> #include <string.h> #include <stdlib.h> main() { FILE *fin; char filename[20]; char data[256]; int n; printf("ファイル名の入力 :"); gets(filename); fin=fopen(filename,"r"); if(fin == NULL){ printf("%sがオープンできません!\n",filename); exit(1); } while(fgets(data,256,fin) !=NULL){ } n=strlen(data); printf("ファイル %s には、%dワードがあります。\n",filename,n); fclose(fin); }

  • ファイルの英字を全部小文字に変換して新規テキストに出力

    テキストファイルの英字を全部小文字に変換して新規テキストに出力するプログラムをつくりましたがうまくいきません。なにがいけないですか? #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define STR_MAX 256 int main(void) { FILE *fi, *fo; /* ファイルポインタ用 */ char fin[100], fout[100]; /* ファイル名用 */ char buff[STR_MAX], *q; /* 文字列用 */ printf("入力ファイル名 : "); /* プロンプト表示 */ gets(fin); /* ファイル名入力 */ printf("出力ファイル名 : "); /* プロンプト表示 */ gets(fout); /* ファイル名入力 */ q = buff;   /* 入力ファイルオープン */ if((fi = fopen(fin, "r")) == NULL){ printf("入力ファイルがオープンできません\n"); exit(1); /* 強制終了 */ }   /* 出力ファイルオープン */ if((fo = fopen(fout, "w")) == NULL){ printf("出力ファイルがオープンできません\n"); exit(1); /* 強制終了 */ } while(fgets(buff, STR_MAX, fi) != NULL){ /* 1行読み込み */ *q = tolower(*q); ++q; fprintf(fo, "%s", buff); /* 1行出力 */ } fclose(fi); /* 入力ファイルクローズ */ fclose(fo); /* 出力ファイルクローズ */ return(0); }

  • fgetsがうまくいきません。

    半角スペースとOで(O = 生存)ライフゲームを作ろうと思っていますが、 printf文で表示するとうまくいきません。 どうしたらよいでしょうか。回答お願いします。 #include<stdio.h> #include<stdlib.h> #define SIZE 20 int main(void) { int i = 0; char board[ SIZE ][ SIZE+1 ]; FILE *fp; if( ( fp = fopen( "life.dat", "r" ) ) == NULL ) { printf("ファイルが見つかりません。---life.dat\n"); exit(EXIT_FAILURE); } for(i = 0; i < SIZE; i++)//初期設定 { fgets( *(board + i) , SIZE+1, fp ); }//初期設定終わり for(i = 0; i < SIZE; i++) { printf("%s", *(board + i) ); } return 0; }

専門家に質問してみよう