• 締切済み

fgetsについて

hydrangeas0722の回答

回答No.3

えっと、標準入力ですよね? これをファイル入出力で応用させるためには、少しだけテクニックがいります。 基本的に、unix系(linux系を含む)は改行に'\n'を用います。 ところが、windows系では行頭復帰も含んでしまう場合があります。 従って、改行コードを削除する文の下に以下のソースを加えてみてください。 //行頭復帰を阻止する if( (n=(strchr(line1,'\r')) ) *n = '\0'; 以上です。でわ。

関連するQ&A

  • C++におけるfgets??

    文字列を入力するときに用いるfgets関数ですが、 C++において fgets(char *,n,stdin) と同等の動作をする関数を教えてください。 よろしくお願いします。

  • fgetsの使い方

    C言語を今日から始めたじいさんです。 宜しくお願い致します。 メモ帳を使って3行ほどの文字列を入力して、text.txtファイルに保存します。 この文字列を読み込んで、1行ずつ印刷しようとしていますが fgetsでtxtファイルの終了条件がわかりません。 while(fgets(row , sizeof( row ) , fp) != NULL){ printf("%s\n , row); } fclose( fp ); return 0; のようにしているのですが、3行印字処理をして異常終了してしまいます。 本に出ている例をそのまま実行しているのですが、うまくいきません。 txtファイルをダンプしてみると各行の後ろに0d 0aたぶんCR,LFが入っていてNULL=00(?)はありません。テキストファイルの作り方に問題があるのでしょうか? それともfgetsの使い方に誤りがあるのでしょうか?

  • fgetsについて

    いつも大変お世話になっております。 またしても基本的なことで恐縮ですが、教えてください。 『fgets()』を使って、標準入力ファイル(stdin)からの情報を読み込む場合、指定されたサイズ以上を入力すると、サイズを超えた部分が切捨てられて最後に'\n'が自動的に付加されると学習しました。 しかし、切り捨てられた部分はまだstdinに残るため、次回の利用でおかしな結果を招くようです。 そこで、stdinのバッファをクリアたほうが良いと思ったのですが、方法が分かりません。 どのようにすればよいでしょうか? 【例】 #include<stdio.h> #include<string.h>     char name[5]; printf("文字列を入力して下さい。>>"); fgets(name,sizeof(name)-1,stdin); printf("読み込み文字列:%s\n",name); このとき、キーボードから4文字入力するとstdinのバッファに'\n'が残ってしまい、5文字以上だと4文字目以降の文字と'\n'が残ってしまうようです。 また、最後に'\0'が付与されるなら、サイズ以上が切捨てられた際もname[4]に'\0'を代入しなくてもいいということでよいのでしょうか? 乱文になってしまい、申し訳ありません。 どうぞ教えてください。

  • 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]); } }

  • fgetsでの入力に関して

    fgets関数にてファイルの1行を入力したいのですが、 レコード内に%(パーセント)が入っているとこの文字が消えてしまいます。 例えば、(%) 累計 (%%) (K)\nのような入力をすると () 累計 (%) (K)\nとなってしまいます。 これを解決する方法はあるのでしょうか? 環境は OS:win xp pro コンパイラ:Microsoft Visual C++ .NET です。

  • fgets関数を使用したときの文字あふれについて

    fgets関数を用いて文字列を入力し、その長さを測るプログラムを作っています。 #include <stdio.h> #include <string.h> #define MAX 256 int main ( int, char *[] ); int main ( argc, argv ) int argc; char *argv[]; { char buf[( MAX )]; while ( 1 ){ memset ( buf, 0, sizeof( buf )); fgets ( buf, MAX, stdin ); if( fgets == NULL ){ break; } printf("入力した文字列の長さは%dです\n" ,strlen( buf )); } return 0; } このプログラムでは、256までしか文字列の長さを測ることができません。 もしこのプログラムで256を超える文字列を入力してしまうと、文字のあふれが発生し、 「入力した文字列の長さは256です」 「入力した文字列の長さは(あふれた文字列の長さ)です」 とこのようになってしまいます。 このプログラムで256以上の文字を読み捨てて、 「入力した文字列の長さは(あふれた文字列の長さ)です」 を表示しないようにできるのでしょうか? また読み捨てた文字列の長さを知ることはできるのでしょうか? もしかしたらfgets関数を使用すると不可能なのではないか?と思っています。 分かる方が居ましたらどうか教えて下さい。 よろしくお願いします。

  • scanfの後のfgetsについて

    #include <stdio.h> int main(void) { char name[10]; int no; printf("ナンバーを入力してください: "); scanf("%d",&no); /* 35を入力 */ printf("文字列を入力してください: "); fgets(name,10,stdin); /*入力できない*/ return 0; } この例文だと、fgets関数が改行コードを読み取って、終了してしまい文字列入力が出来ないみたいなんですが、scanfの後にfgetsを使うような(scanfとfgetsの間にscanfの残した?改行コードを取り除く方法)処理はどのような方法があるのでしょうか? 試しにfgets文を2度書いたら思っていた動作をしてくれたのですが、はたしてfgets文を2度書くというような事をしていいものなのでしょうか?見た目もなんだか変な感じですし。。↓ #include <stdio.h> int main(void) { char name[10]; int no; printf("ナンバーを入力してください: "); scanf("%d",&no); /* 35を入力 */ printf("文字列を入力してください: "); fgets(name,10,stdin); fgets(name,10,stdin);  /*入力できる*/ return 0; }

  • fgetsを使って入力した文字列を読み込む。

    こんにちは。私は30代の男性です。 上司から、「C言語でコーディングする際にscanfは使わずにfgetsを使うように」との指示があったのですが、scanfしか使ったことがないので、具体的にどうコーディングすればいいのかわかりませんでした(聞いても教えてもくれず…)。どのようにすればfgetsを使って入力した文字列を読み取れるのか、わかる方がいらっしゃれば簡単な例文で教えて頂けるとありがたいのですが。 どうぞ宜しくお願い致します。

  • fgetsでバッファ残留文字列を無視して読み込む

    お世話になります。 早速質問させていただきます。 言語はC++です。 ファイルに、以下の文字列があったとします。 ============================ 123456789012 12345678901 1234567890 123456789 ============================ この時、 fgets( str, 10, fp); printf("str (%2d)= %s\n", strlen(str), str); を、EOFになるまで繰り返します。 すると、実施結果は ============================ 123456789 012 123456789 01 123456789 0 123456789 ============================ となります。 これは、fgetsで10というレングスを指定しているために、1行読み込んで、10文字以降の文字列はバッファに残ってしまっているため、 2度目のfgetsで、10文字以降の文字列が読み込まれ、書き出されているものと思われます。 この時、fgetsで1行読み込んだ後、バッファに残った文字列を無視し、2度目のfgetsで、2行目を読み込むにはどうしたらよいでしょうか? 有識者の方、ご教授ください。よろしくお願いします。

  • fgetsの扱い方について

    今回、c++(言語はc言語)?で下のようなプログラムを書きました。 内容は、与えられたワイド文字列をマルチバイト文字列に変換した後、重要単語.txtに載っている単語が変換された文字列にあるか、を調べるものです。 ただ、実行できていないためプログラム自体があっているかわかりません。 これをvc++2010でエラーなくビルドしたあと、実行すると「ハンドルされていない例外が発生しました」とエラーが出ます。 使い方もよくわかってないブレークポイントを使って調べてみたところ、while(fgets(word,50,fp)!=NULL){ ここまで来るとエラーが発生してるみたいです。 なにが間違ってるんでしょうか? 解決策よろしくお願いします #include <stdio.h> #include <string.h> #include <locale.h> #include <stdlib.h> int main(){ setlocale( LC_ALL, "Japanese"); FILE *fp; fp=fopen("重要単語.txt", "w"); fclose(fp); if( (fp=fopen("重要単語.txt", "r")) ==NULL){ printf("File Not Open!!\n"); } wchar_t *input = L"音声認識を認識した後に変換を行う"; char str[200]; char word[50]; char iword[100]="●"; int pt=0,pp=0,cnt=0,i=0; //str=input;wchar_t→char変換する size_t wlen=0; wcstombs_s(&wlen,str,500,input,_TRUNCATE); while(fgets(word,50,fp)!=NULL){ strcat(word,'\0'); while(str[pt]!='\0'){ if(word[pp]=='\0'){ pp=0; strcat(iword,word); strcat(iword,"\n"); } else if(str[pt]==word[pp]){ pt++; pp++; } else{ pt=pt-pp+1; pp=0; } } pt=0; } fclose(fp); printf("変換後→%s\n",str); printf("重要単語\n%s",iword); return 0; } 重要単語.txtの中身 認識 音声 変換