• ベストアンサー

getcの改行判定

Windowsの構文解析でgetcを使ったプログラムを作ったのですが、 改行の判定に c = getc(fp_in); if(c == '\n'); とすると、 コマンドプロンプトに「コードは効果を持たない」と言われ、 コンパイルして実行してもif文は真にならないみたいです。 改行の判定を行うには正しくはどう記述すればいいのでしょうか?

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

正直言、現在開示されている情報だけでは 「開示されていない箇所でなにかおかしいところがある」 「開示した情報が実際のものと違いすぎて参考にならない」 「確かめかたが間違っていて実際の状況と違う」 「fp_inの入力ファイルに改行がない(少なくとも、CRLFまたはLFは使われていない)」 のどれかだ、としか言いようがありません。 既出ですが、 「エラーメッセージを正確に書く(できればコピペする)」 「その警告箇所周辺のソースコードをコピペする」 とでもしてもらわないと、アドバイスのしようがありません 改行コードが特殊なものでなければ、判定は c=='\n' で問題無いはずです。 例えば、下のソースを test.c というファイル名で保存してコンパイル→実行したら、どうなります? #include <stdio.h> int main() { int c; FILE *fp_in = fopen("test.c","r" ) ; if ( fp_in == NULL ) { return 1; } for(;;){ c = getc(fp_in) ; if ( c == EOF ) { printf("\nEnd of file\n"); break ; } if ( c == '\n' ) { printf("\nEnd of line\n"); break ; } putchar(c) ; } return 0 ; }

wav1374
質問者

お礼

#include <stdio.h> End of line 正しく判定が行われてますね。 ではc == '\n'という判定の仕方は正しいのですね。 ということは他の箇所に誤りがある様です。 回答して下さった方々どうもありがとうございます。 そして色々とご迷惑お掛けしてすみませんでした。 自分で再度ソースを見直してみます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

警告は出ても問題ないケースもあるけれど、やはり出ないようにプログラムを書くのが上達への一歩。 発生箇所はちゃんと近くに書いてあります。(括弧の不対応など、発生箇所と原因が離れている場合もありますが) エラーメッセージの内容と、ifが成立しないということから推測すると c == getc(fp_in); になっている可能性の方が高そうですね > #2さん 手許のVisualStudio2005で実験コード書いてやってみたら、似た警告が出ました。 さらに、その後に「==は=ではないですか?」と修正のヒントまで表示されました。

wav1374
質問者

補足

コンパイルはborlandを使用しています。 あとc = getc(fp_in);は代入です。 今のところc == '\n'という記述で改行は判定できないのでは?というのが考えです。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

えぇと.... 質問文がハチャメチャ.... まず if(c == '\n'); と if(c == '\n') break; は全然意味が違うわけだから, なぜわざわざ後者を見せないで前者の形で質問したのかが分からん. あと, 「コマンドプロンプトに『コードは効果を持たない』と言われ」も意味不明. たしかにコマンドプロンプトで出てくるメッセージは謎なこともあるけど, それにしてもこんな謎のメッセージは出ない. とりあえず ・どういう操作をしてどんなメッセージが出たのか ・そのメッセージはプログラムのどの部分に対して出ているのか を正確に出してください. あと, 当該部分で使っている変数があればその宣言も念のため正確に書いてください. 今出ている情報だけだとあまりにも不正確なので「質問文では == になってるけど, 実はプログラムでは = と書いている」という疑いを捨てきれないのよ....

wav1374
質問者

補足

if文が真にならない原因が知りたかったので、 c =(代入演算子です) getc(fp_in); if(c ==(関係演算子です) '\n') 真の場合(略); と省略しました。分かり難くて申し訳ないです。 現状では、 ・if文が偽になっていることは確認済み ・警告はc == '\n'に対して出ている (getcが改行を読み込んだ場合 c == '\n'では改行判定にならない、 又は記述が正しくない?) 要するにgetcが改行を読み込んだ場合、 ・改行を判定するにはどう記述すればいいのか? を聞きたいのです。

全文を見る
すると、全ての回答が全文表示されます。
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

>if(c == '\n'); 上記のコードのとおりであるならば、cの値がいくつであろうと何も行いません。 正確には、 (1)cの値が'\n'以外の場合:括弧以降の文の終わりの次まで進む (2)cの値が'\n'場合:括弧以降の文を処理するも、その文が ; のみなので何もせず次の文に進む という処理を行います。 あるいは、コンパイラが生成した実行ファイルでは最適化によってこの処理自体が消えている可能性があります。

wav1374
質問者

補足

いえ実際にはifが真である場合にはbreakでループを抜け出すように記述しています。 for(;;){ c = getc(fp_in); if(c == '\n') break; …(略) } それでどうしても改行でループが抜け出せないので、 記述の仕方が違うのかなということです。 説明不足ですみません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ファイル読み込み EOF 判定

    数字の羅列した単純なテキストファイルを読み込ませたいのですが、 以下のようにすると、途中で改行などで一行あけた場合、そこで読むのを ストップしてしまいます。 if (fgets(buf, sizeof(buf), fp) == NULL) { 改行にくじけることなく、ファイルの最後まで読み込ませるにはどうしたら いいのでしょうか。 ちなみに、以下のようにやると、   while(getc(fp) != EOF){ こんどは改行をものともせず、ファイルのお終いまで読んでくれるのですが、 2バイト文字(頭一文字が化ける)、のっけ一行目に数値(10桁)を置くと 一文字かけて9桁になってしまいます。 2行目以降はちゃんと10桁です。(一行目に改行をいれて、2行目以降に書くと大丈夫のようです。変) 簡単なようで、つまってます。どうかよろしくお願いします。

  • c言語 ファイルの読み込み位置

    ファイルのアクセス位置を最後から7行目に移動させるプログラムを作っています。 \nを数えることで行数を数えているのですが、以下の処理、間違えていますか? コンパイルしてもできていないので間違えていることは明白なのですが、どこが違うかわかりません。 誰か、力になってください! fseek(fp, -1, SEEK_END);/*読込位置最後にする */ while(!fseek(fp, -2, SEEK_CUR))/*逆順読込ループ*/ {   if(getc(fp)=='\n')  {cnt++;}  if(cnt == 7)  {break;} }

  • 改行文字について

    #include<iostream> using namespace std; int main(void) { char c; while (cin.get(c)) if (c == '\n') cout << "[RET]\n"; else cout << c; return(0); } これのif (c == '\n')の改行文字と等しいとは何のことを指すのでしょうか? よろしくお願いします。

  • 英文字の出現頻度

    英語で書かれているファイルを読み込んで英文字の出現頻度を調べるプログラムを作ったのですが、ところどころ正確な数が表示されません。どなたか教えてもらえませんか?欲を言えばスペースや改行もカウントできれば良いのですが・・・よろしくお願いしますm(_ _)m #include <stdio.h> #define N 500 int main(int argc, char *argv[]) { int c,i=0; int X[N]; FILE *fp; char ch[N]; if( argc != 2) { printf("使い方:コマンド名に続きファイル名を入れてください\n"); return -1; } fp = fopen( argv[1],"rb"); while(fgets(ch,500,fp) != NULL ) { printf("%sファイルにおけるアルファベットの出現頻度\n",argv[1],ch); { while ((c = getc(fp)) != EOF) if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') X[c]++; { for (c = 'a'; c <= 'z'; c++) printf("%c:%d\n",c, X[c]); printf("\n"); for (c = 'A'; c <= 'Z'; c++) printf("%c:%d\n",c, X[c] ); printf("\n"); } } } fclose(fp); return 0; }

  • getcによる空白文字カウントでの問題

    下記リストをWindows98、BCC5.5及び、MinGWでコンパイルして実行 する場合、/*注*/の1行をコメントアウトしますとその下のcountが 画面に表示されません。私にはこれは理解の出来ないことで、かな り悩んでいます。どなたかお分かりになる方いらしゃいましたら、 ご教授願います。 #include <stdio.h> int main() { int ch,count=0; printf("文字を入力して下さい。\n"); while((ch=getc(stdin))!=EOF) { if(ch==' ') { count++; } } /*注*/ printf("\n"); printf("count of space = %d \n",count); return 0; }

  • 書き込んだファイルに改行が入ってしまう

    最後のfp3で書き込んだファイルのsample.txtが Problem Solving and Program Design in CC : A Reference ManualC Primer PlusC How to ProgramC Programming for Engineering and Computer ScienceIntroduction to CProgramming Embedded Systems in C and C++Absolute Beginner's Guide to CNumerical Recipes in C : The Art of Scientific ComputingThe C Programming Language このように途中で改行されてしまいます。 これはBorlandの特徴で仕方がないことなんでしょうか。。 それともプログラムが間違ってるのでしょうか。 ご教授よろしくおねがいします。 if((fp3 = fopen("sample.txt","w")) == NULL){ printf("can't open"); return(-1);//強制終了 } else{//タイトルだけをサンプルに書き出す for(i=0;i<M;i++){ fprintf(fp3,"%s",book[i].title); } } fclose(fp3); fclose(fp2); fclose(fp1); return(0);//正常終了 }

  • 改行するにはどうしたらよいのでしょう?

    ホームページをPHPを使って、と思いイザ本を買って来て取り組みましたが、いきなりつまづきました。改行ができません。 下のように記述したら、ブラウザにはABCとつながって表示されました。バックスラッシュを入れればよいのかなと思い、調べましたが何やらwindows系では入らないようでした。\nでは、改行にならないのでしょうか。やはり、バックスラッシュを入れないとだめなのでしょうか。どなたか、お分かりになる方教えてください。宜しくお願いいたします。 <?php print "<HTML>"; print "<BODYL>"; print "A\n"; print "B\n"; print "C\n"; print "</BODY>"; print "</HTML>"; ?>

  • 改行<br>を<br />に変える方法

    テキストエリアで改行した際に以下のコードですと改行は<br>になります。 これを<br />に変更したいのですが、自分なりに試してみたのですが全くうまくいきません。 sub decode { &ReadParse; while (($key,$val) = each %in) { if ($key !~ /upfile/ ) { &Jcode'convert(*val, "utf8", "", "z"); if ( $key !~ /label_name/ ) { $val =~ s/</&lt;/g; $val =~ s/>/&gt;/g; } $val =~ s/\r\n/<br>/g; $val =~ s/\r|\n/<br>/g; } $in{"$key"} = "$val"; } どなたか<br />に変更する記述を教えて頂けませんでしょうか?

    • 締切済み
    • CGI
  • コマンドプロンプトで変数が数字であることを判定する方法

    コマンドプロンプトで変数の中身が数字であることを判定することは可能でしょうか。 変数の内容が0000や1020ならばTRUE、00A0なんかだとFALSEに するIF文を作りたいのです。

  • ファイルを読み込んで改行だけの行を取り除きたい

    こんばんは。 ファイルを読み込んで、改行だけの行を省いて、上書きしたいのですが なぜかうまくいきません。 ループ内にある改行の判定をするIF文がいけないと思うのですが…。 教えていただけないでしょうか? また、シングルクォーテーションダブルっクォーテーションは同じ意味 なのですか?「""」と「''」 作ったプログラムは以下です。 open(OUT,">$ssifile"); #改行のみのデータは除く @newtbl = (); foreach $siline ( @slines) { if ($slines ne "\n") { push @newtbl, $siline; } } print OUT @newtbl; close(OUT); 宜しくお願いいたします。

    • ベストアンサー
    • CGI
XK500 wifi接続できない
このQ&Aのポイント
  • XK500のwifi接続がうまくいきません。試行した回数は多く、すべての可能な解決策を試しましたが、接続が確立されません。
  • パソコンの画面には該当するプリンターが表示されますが、wifi接続ができません。
  • セキュリティソフトをアンインストールしても、問題は解決しませんでした。
回答を見る