「機械語」の版間の差分

削除された内容 追加された内容
→‎EOFを用いた例: EOFが機械語特有だと誤解されると困るので、追記。
344 行
たとえばテキストファイル "bintest1.txt" に
9A B3 72
という6文字だけのテキストがあったとしましょう。(なお、半角スペースを含めると8文字です)
 
一般的なバイナリエディタによるテキスト出力では、上記のように16進数の2桁ずつ(たとえば「9A」)で1つのブロック単位になり、ブロックとブロックの間には半角スペースで空白文字が1文字ぶん空いているのが通常です。
これをそのまま機械語にしたい場合、下記のプログラムで行けます。もしかしたら他の方法もあるのもしれませんが、見つからないので下記コードをwikibooksdで作りました。
 
のテキストファイルの内容をそのまま機械語にしたい場合、下記のプログラムで行けます。もしかしたら他の方法もあるのもしれませんが、見つからないので下記コードをwikibooksdで作りました。
 
;コード例
403 ⟶ 405行目:
 
:※ 上記コードは、分かりやすさを重視して、あえてfor文などのループ機能を用いていないです。実際のソフトウェア作成の際には、for文で実装する事になると思います。
上記のプログラミングのコツとしては、<code>char hairetu[1]; </code> のように1要素だけの配列を作ることです。ついつい「3ブロック読み取りたいのでついつい<code>hairetu[3]</code>とかしてしまがちですが、それだと、おそらくプログラミングに失敗します。
 
この配列 hairetu は、単に int kazu をそのままchar型に格納するための配列なので、要素数は1でイイのです。
409 ⟶ 411行目:
strtol とは単に、読み取った数字を、読み取りのの際についでに16進数や10進数などの数値変数に変換してくれる、c言語の便利な関数です。
 
 
scanf は、テキスト文字を、起点は開始位置または直前の読み取り終了位置から、終点は次の半角スペースまでで、読み取りをする命令です。短く正確に説明するのが難しいので、詳細はwikibooks『[[C言語/ファイル入出力]]』にあるscanfの説明を読んでください。
 
 
もしかしたら canf の代わりに fgets でもコードが書けるかもしれませんが(なおfgetsはテキストファイルから1行ずつ読み込む命令)、scanf のほうがより入門的でしかも短いコードが書けるので、本wikiでは scanf を採用しました。
 
 
==== 実用例 ====
機械語に限った事ではないですが、fscanf は、読み取り位置が最後まで来ても、そのままでは、最後の文字を何度でも読み取れてしまいます。
 
なので、もし読み取り位置が最後まで来たら、その直後の段階で、書き込み処理を終了する必要があります。
 
この書き込み終了判断の実装のために必要な機能は、fscanfの返却値です。
:※ 一般的な市販のC言語解説書では上記の問題の解決策が書かれないので、『機械語』科目ですが間借り(まがり)的に解説します。
 
 
fscanfは、もし最後のブロックに来た後に、もう一度fscanf を使うと、返却値として -1 を返します。なおwindowsの場合、最後のブロック以外では(プラスの)「1」を返します。