ページ 11

文字の取得と判別について(><;)

Posted: 2010年9月12日(日) 00:34
by 青3号
C言語で、
テキストファイルからテキストモードで文字を2文字分読み込んで、
その文字が"p"かつ"i"であるかどうかの判別をしたいのですが、
以下のコードだとコンパイラさんに
char*型はchar型に変換できない、と怒られたのです。
どうしたら文字の判別ができますか?教えてください。
なるべくバイナリではなくテキストモードでchar型の配列str[2]に
読み込んだものを使用したいのですが...
str[/url]がもしint型配列だったらアスキーコードの10進表を使えばできますか?

(追伸)あと、テキストモードで一行ずつ読むfgetsだと、
改行の識別ができますが、fgetcだとできないのでしょうか?

char str[2];

fgets(str,2+1, fp);

if((str[0]=="p")&&(str[1]="i"))
{
~処理~
}

Re:文字の取得と判別について(><;)

Posted: 2010年9月12日(日) 00:41
by パコネコ
関係なかったらすいません
=="p"
ではなく
=='p'
ではないでしょうか?

=========
ついでに
iのほうが「==」ではなく「=」になってます。 画像

Re:文字の取得と判別について(><;)

Posted: 2010年9月12日(日) 00:54
by フリオ
 
char str[2];
に対して、
fgets(str, 2 + 1, fp);
はだめです。

>(追伸)あと、テキストモードで一行ずつ読むfgetsだと、
>改行の識別ができますが、fgetcだとできないのでしょうか?
 何故、"出来ない"と考えたのでしょうか。
 
画像

Re:文字の取得と判別について(><;)

Posted: 2010年9月12日(日) 01:46
by 青3号
>パコネコさん

そうでした、シングルで囲むんでした。
=の方は私の誤記入です。
ありがとうございます。

>フリオさん

2文字読みたいなら,
単純に fgets(str,2, fp); でよいのですね?
何か勘違いしていたようです。

>何故、"出来ない"と考えたのでしょうか。

ん~、あるマニュアルを見ただけなんですが、fgetcについて、

ストリーム から次の一文字を取ってきて返す。
ファイルの終端に達していたり、
エラーが発生している場合にはEOFを返す。

とありました。終端はあるのに改行は書いてないので、
どうやって改行を識別するのかなと・・・。
fgetsの方なら一行読んで配列に渡せばnullがつくから便利ですが...。
テキストファイルで改行をバイナリでみると0D0Aが入っていますが、
終端には0D0Aが見あたらなかったので、
改行と終端は何か別な仕組みでできていて、別の処理が必要だと思ったのですが、
いちいちfgetcで0D0Aがあるかどうか調べる必要があるのですか...。

あとイマイチEOFとNULLと\0と0D0Aの違いと仕組が理解できてません。

Re:文字の取得と判別について(><;)

Posted: 2010年9月12日(日) 02:34
by fatens
>2文字読みたいなら,単純に fgets(str,2, fp); でよいのですね?

そういう意味ではなく、
fgets関数は最大で第2引数に指定した数-1の文字列を読み取ります。
改行またはEOFで読み取りを終了し、その改行文字を格納して、最後にナル文字('\0')を格納します。
char str[2]; に対してfgets関数で2文字読み込む際、改行文字がなかったとしてもナル文字の分がありません。
strの要素数は余裕を持っておく必要があるということです。


>終端はあるのに改行は書いてないので、どうやって改行を識別するのかなと・・・。

識別というのが何を意味しているのかよくわかりませんが、
fgetc関数の返却値を調べれば良いのではないでしょうか。


>あとイマイチEOFとNULLと\0と0D0Aの違いと仕組が理解できてません。

EOFはファイルの終端(End Of File)の略です。
NULLは何も指していない特別なポインタを意味します。
\0というか'\0'は文字列の終端を表します。
0D0AはWindows環境のテキストファイルの改行文字のアスキーコードです。

Re:文字の取得と判別について(><;)

Posted: 2010年9月12日(日) 08:53
by シエル
テキストモードで読めば、改行は0D0Aから0A(\n)だけに、自動的に変換されます。

Re:文字の取得と判別について(><;)

Posted: 2010年9月12日(日) 12:00
by アビゲイル
EOFは不思議で自分も調べたことがありますね。
例えば、200byteのファイルがあるとすると、次のbyteの201byte目が暗黙のルールとしてEOFになります。
決まりごとなので、実際にEOF分として1byte使用しているわけではありません。
つまり、201byte目(最大サイズを超えた所)にアクセスした時、OSが返す値がEOFということです。
エラーの一種です。

fgetsはただのfgetcのラッパーですね。
※実装者によって実装は異なってきます。
一部抜粋) ANSI C言語辞典

for(; n>1; n--)
{
int c=fgetc(stream); /* 1文字入力 */
if(c==EOF)break;
*s=c; /* 配列に代入 */
s++; /* sを進める */
if(c=='\n')break;
}
~
*s = '\0';

ウィンドウのサイズを640×480から変更

Posted: 2010年9月22日(水) 22:02
by Ultimate
ウィンドウサイズを横に伸ばして縦はそのまま(たとえば800×480など)のように変更したいのですが、関数が見つかりません。
方法はありますでしょうか?

Re:ウィンドウのサイズを640×480から変更

Posted: 2010年9月22日(水) 22:05
by MNS
開発環境が不明ですが、恐らくDXライブラリを使用しているのだと思います。
すると、SetGraphModeという関数があります。
http://homepage2.nifty.com/natupaji/DxL ... .html#R4N1
使い方はリファレンスを参照してください。

Re:ウィンドウのサイズを640×480から変更

Posted: 2010年9月22日(水) 22:17
by Ultimate
すみません、環境を書き忘れてました。DXライブラリでOKです。

その他画面操作系関数にありましたか。ウィンドウ操作の部分などを見て見つからなかったので質問しました。

ありがとうございました。

うまく変更できました。