わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

最後の改行に注意して,ファイルの行数を数えましょう

 いきなりですが問題です.WindowsのNotepad++を使って,「hello, world」を出力するCのプログラムを写経しました.
f:id:takehikom:20191030055610p:plain
 このプログラムの行数を答えてください.
 さっそくですが解答です.編集領域の左の行番号は,1から8までですし,下部のステータスバーには,「lines: 8」と書かれています.だから答えは「8行」です.
 …本当にそれでいいのでしょうか?
 といったところで,本日の問題の経緯です.2年後期のプログラミング科目です.数十行程度の2つのCのソースファイルがあり,それらは同じ機能なのですが,書き方が違います.一方はmain関数ひとつに全ての処理を詰め込んでいるのに対し,もう一方は機能ごとに関数を分割しています.
 そこでそれぞれのファイルについて,ファイル全体の行数や,空行・コメントを除外した行数,定義されている関数・変数の数,そしてmain関数内の行数などを数えて,比較することを,課題に入れました(そのあと,機能ごとに関数を分割するほうがなぜ良いかを,文章にしてもらいました).答案を回収して読んでいったところ,こちらの用意していた正解と完全に一致したのは,ごくわずかでした.ですが本日,関心を向けるのはその「すべて一致」のほうではありません.ファイル全体の行数だけが,1ずつ多く,それ以外は一致という答案が,いくらか,あったのでした.
 昨年度も同様の問題を実施していて,そのときの「すべて一致」の答案の数と,今回の「ファイル全体の行数以外は一致」の数が,同じでした.
 そこで気になったのが,ソースファイルを見るためのソフトウェア(テキストエディタまたはソースコードエディタ)です.昨年度の授業では,学内計算機をLinuxで起動して使用し,テキストエディタは特に指定していませんでした.
 今年度はBYOD PCの使用です.テキストエディタの使用は指定しなかったものの,1年前期の情報処理科目の第2回の授業でインストールさせている,Notepad++を推奨していました.
 課題のファイルを当ブログ上で公開するわけにいきませんので,かわりに今回,C言語/基本的なプログラム - Wikibooksソースコードを,コピーして貼り付けました.貼り付けたところ,次のようになりました.この場合,「lines: 7」です.
f:id:takehikom:20191030055619p:plain
 これでも問題なくコンパイルできますが,「}」でファイルの中身が終わるのは,個人的に好みでないので,最後に改行を入れると,冒頭の画像のようになったのでした.
 さて「8行」という答えでよいのかというと,まずいんとちゃうかと言わざるを得ません.というのも,空のファイル*1をNotepad++で開いたとき,「lines: 1」と表示されるのです.
f:id:takehikom:20191030055626p:plain
 length(字数)が0で,行数が1というのは,おかしな話です.
 そこで「行数とは何か?」となります.一つの答えは「改行の数」です.それを基準とすると,空のファイルは「0行」となり,上のhello.cのうち,「lines: 8」のほうは「7行」ですが,貼り付けた直後で「lines: 7」のほうは,「6行」となってしまいます.
 以下のページで,ファイルの終わりに改行のない場合も考慮して,行数を適切に数えてくれない方法,数えてくれる方法がまとめられています.

 行数とは何かの,別の答えは「改行の数.ただしファイルが改行で終わっていない場合には1を加える」…いや,ダメです.これは空のファイルも「改行で終わっていない場合」に該当し,1行になってしまいます.
 少し修正して,「改行の数.ただし最後の改行のあとに非改行文字がある場合には1を加える」とすれば,上の「lines: 7」「lines: 8」のhello.cはともに「7行」であり,空のファイルは「0行」です.

*1:Windowsだと,ファイルやフォルダのないところを右クリックして,「新規作成」「テキスト ドキュメント」の順に押せば,サイズ0のファイルが作れます.Linuxなどのコマンドラインでは,「touch empty.txt」というコマンドで(その実行より前にempty.txtというファイルがなければ)生成できます.