「C言語/ファイル入出力」の版間の差分

削除された内容 追加された内容
M added Category:C言語 using HotCat
Ef3 (トーク | 投稿記録)
s/命令/関数/、SEGVをエラーと表現している部分を修正。
タグ: 2017年版ソースエディター
109 行
 
::なお、英語で、文字や文章を書くことを write (ライト)という。 wとは、その write の 頭文字w のこと。
::英語で、本や文章を書く読むことを read (リード)という。 rとは、その read の 頭文字r のこと。
::英語で、追記(ついき)や付録(ふろく)の加することを アペンディクス appendixappend という。 aとは、その appendixappend の 頭文字a のこと。
 
 
なお、一般にファイル操作のプログラミングでは、安全のために、ファイルのオープンに失敗した場合を想定して、そのような処理を書く必要がある。
 
fclose は、ファイルを閉じる命令関数である。クローズしている最中のファイルは、プログラミングによる読み書きなどの操作をできない。
 
 
125 行
ソースファイルのあるフォルダの場所は、Windowsの場合、標準設定では
 
:\ユーザー名\syntaxhighlightsource\repos\プロジェクト名\プロジェクト名
アドレスのフォルダにある。
 
VisualStudio 2019 をインストールしたとき、既に syntaxhighlightsource というフォルダのある場合を除けば、普通は インストール時に syntaxhighlightsource という visual studio のプログラミング用のフォルダが自動作成されているので、そこのフォルダを探せばいい。
 
 
139 行
 
ファイルに何かデータを書き込むには、 <code>fprintf</code> という関数を使う。
:(なお、「fprintf」とはC言語の専門用語であり、日常英語には無い用語である。読みは、日本では慣習的に「エフ・プリントエフ」とでも読む。)
 
fprintf の冒頭のfは、ファイル関係であることをあらわしている。最後のfは、もともとC言語には「printf」(プリントエフ)という関数があり、(最後のfは)ファイルとは無関係)Format の f
 
 
896 行
Windows(Visual Studio)でもLinux(gcc)でも、
 
<code>fp1 = fopen("test1.txt", "r");</code> のような命令関数で読み込みに失敗した場合、つまり、普通なら読み込み対象のファイルが無い場合は、
 
そもそも、命令関数<code>fp1 = fopen("test1.txt", "r");</code>の実行直後は、
 
まだファイル"test1.txt"は、まったくオープンされて無い状態です。
1,014 行
 
 
ついつい、ファイルを開けなかった場合などには、「この命令FILE構造体へのポインタは用済みだから、すぐファイルを閉じよう(×)」って発想で、むりやりブロック中でクローズしようと思いたくなります。
 
しかし、上記のように、読み取りに失敗しあたとに、むりやりクローズしようとしても、実行時にエラーになります。
 
 
これはどういうことかというと、ファイルのオープンに失敗した場合、そもそも、そのファイルはオープンされてないのでクローズの必要もないです。
 
また、そのオープンに失敗したファイルをクローズしようとし、fp1 が NULL なので if 文が通っ場合のでfclose(NULL)が実行時エラーになりまを引き起こことは自明
 
 
==== Linuxの場合 ====
Linuxでも同様です。もしもファイルのオープンに失敗した場合、Linuxでも、そのファイルはオープンされてないのでクローズの必要もないです。
 
また、もしもオープンに失敗したファイルをクローズしようとした場合、Linuxでも実行時にエラはセグメンテションホルトになります。
 
Linuxの場合、コンパイルできてしまうかもしれ無い場合もありますが、しかしビルドされた実行ファイルの実行時にエラーになり、「コアダンプ」などのメッセージが表示されます。
 
Linuxの場合、コンパイルできてしまうかもしれ無い場合もありますが、しかしビルドされた実行ファイルの実行時にエラセグメンテションホルトになり、「コアダンプ」などのメッセージが表示されます。
 
たとえば、次のコードは、読み取り対象のファイル"SettingFile.txt"の無い場合には、実行時にエラーになります
1,066 ⟶ 1,063行目:
 
 
いっぽう、次のように改善して、読み込み失敗後のクローズ命令を除去すれば、エラセグメンテションホルトにならず、実行できます。
 
(Fedora 31 で確認ずみ)
1,104 ⟶ 1,101行目:
 
上のコードの
// ここではないfcloseからです。そのような動作は、エラーになり、認められません。
// ここではない
の場所で<code> fclose(fp1);</code> でクローズすると、ファイルの存在しない場合にエラーになります。なぜなら、オープンしてないファイルをクローズしようとしているからです。そのような動作は、エラーになり、認められません。
 
 
同様に、elseブロック内でクローズした場合でも、さらに「ここではない」の場所でもう一度クローズしてしまうと、これもエラセグメンテションホルトになります。
 
 
1,117 ⟶ 1,113行目:
 
 
しかし、読み込みモードでは、対象のファイルが無い場合には、けっ実行形式は開こうとてC言語コンパたファラはルを作成しません。
 
<!-- 「読み込みモードの対象ファイルが無い場合に、作成したい」と前提が意味不明。また最初の fopenで開いたストリームを始末していない。レースコンディションがある。など問題が多い。
 
では、どのような場合に、読み込みモードの対象ファイルが無い場合に、作成したいと思うのでしょうか。
1,229 ⟶ 1,226行目:
Aborted (コアダンプ)
</pre>
-->
 
=== メモのあるファイルの数値の読取 ===
1,340 ⟶ 1,338行目:
 
== 文字コード ==
{{Main|[[w:Microsoftコードページ932]]}}
Windowsの場合、システム内部の文字コードには原則的にUnicodeを使っているのだが、しかし例外的にコソール画面(DOSプロンプト画面)ではマイクロソフト独自規格の文字コードを使っている。
 
マイクロソフト社は、これをアメリカ標準規格のANSIと呼んでいるが<ref>マイクロソフトは、CP932を「ANSI」とは自称しておらず、[https://docs.microsoft.com/ja-jp/host-integration-server/core/ansi-oem-code-page-support-snanls-1 ANSI/OEM Code Page Support (SNANLS)]の一環として、'''ANSI/OEM - Japanese Shift-JIS'''の名称でサポートしている。この節は、この誤解に基づいて編集されていることに注意する必要がある。</ref>、実は、中身は米国の行政府の定める本物の1バイト文字のANSIでなく、マイクロソフト独自規格の自称「ANSI」である。おそらく、マイクロソフト独自規格の自称「ANSI」は、日本語などの2バイト文字の表示機能を含むので、自称「ANSI」も2バイト以上の文字であろうと考えられている。
 
1980年代くらいの古い、マイクロソフト日本法人などの開発したShift-JISという比較的に低バイト文字(2バイト以上の文字)の独自規格を、マイクロソフト米国法人の古い低バイト文字(1バイト以上の文字)の文字コードとすりあわせた独自規格のことをマイクロソフト社は「ANSI」と称しているようだ。
 
いちおう、現在ではShift-JISは日本工業規格になっているが、実際のWindowsでの文字コードの実装では、Windows用に独自にアレンジされたものを使っており、厳密には区別のためCP932という文字コード名で、技術者は呼ぶ。([[w:Microsoftコードページ932]])
 
 
1,357 ⟶ 1,356行目:
さて、上述のプログラム例で紹介したソースコードのように、特に文字コードの指定をする必要なく、日本語も表示できる。
 
マイクロソフト社が、そのように、コソール(DOSプロンプトの機能を調整しているからである。
 
 
ソール画面ドプロンプトで表示する場合、読み取るテキストファイルの文字コードは自称「ANSI」形式にしておけばいい。アクセサリ「メモ帳」の標準コードは「ANSI」(マイクロソフト自称)になっているので、特に変更する必要は無い。
 
 
もし、単に、あるテキストファイルを読み取ってコソール画面ドプロンプトで表示するだけの場合なら、むしろUnicodeは、使ってはならない(少なくとも初心者は)。
読み取り対象のテキストファイルをUnicodeなどに変換すると、コンソール表示の際には、文字化けをしてしまう。
 
 
 
ただし、コソール画面ドプロンプト以外のGUIアプリケーションの作成では(Windows API というのを使うと、GUIアプリを作れる)、文字表示の関数がANSI形式に対応しておらず Unicode 対応になっている場合もある。最終的に現代のプログラマが作るアプリケーションのほとんどはGUIアプリであるので、Windowsシステム内部の文字コードがANSIとUnicodeに不統一になっているのは、これは深刻な問題である。
 
 
1,390 ⟶ 1,389行目:
 
 
もっとも、Windowsのコソール画面ドプロンプトに表示する場合、そのような言語指定なく、表示できる。
 
 
1,449 ⟶ 1,448行目:
</pre>
 
Fedora28の場合、読み取り対象のテキストファイルの文字コードを何に変えても、コソール画面ドプロンプトで正しく表示される。
 
なお、Geditの変換可能な文字コードの一覧に「日本語 (CP932)」 というのがあるが、これがマイクロソフト Shift-JIS のことである(つまり マイクロソフト自称「ANSI」)。もし、マイクロソフト自称ANSIとLINUX用テキストファイルを共通化したい場合、 CP932 を選べばいい。
1,527 ⟶ 1,526行目:
 
 
なお、Linuxでよく標準的に付属してくるGCCコンパイラ glibc には、fopenのワイド文字バージョン( wfopen のような関数)は無い。
 
また、fopenで読み取るファイルに日本語を使うと、文字化けをしたり、ファイルを開くのに失敗したりする。