こんにちは､ そしてお帰りなさい｡
この講義では､ ファイルへの書き込みについてお話したいと思います｡
今回は､ テキストファイルへの書き込みに絞って説明します｡
これから学ぶのは､ 文字を書く方法､ 文字列を書く方法､
そして書式付き出力を書く方法です｡
読み取ることができたのも3つの方法｡
そのためには､ 3つの機能を使いこなす必要があるのです｡
最も単純な書き込み操作は, 関数fputcで提供される｡
つまり､ 文字を読むためのfgetcがあったように､ 文字を書くためのfputcがあるのです｡
これは､ テキストファイルfputcに1文字を書き込むものです｡
文字列を書くほど効率的ではありませんが､ 時には必要です｡
第1パラメータに整数, 第2パラメータにファイルポインタをとり,
整数を返す｡
この関数は､ 第1引数で指定された文字を第2引数で指定されたファイルに書き込む｡
つまり､ ファイルポインタは､ 常に書きたいファイルを表しているのです｡
そして､ 実際に書き込みたいキャラクターが最初のパラメータになります｡
成功した場合は､ 書き込まれた文字が返される｡
eofを返した場合は､ 失敗したことを意味することを覚えておいてください｡
eof 以外を返した場合は､ 成功したことを意味する｡
実際には､ 物理的なファイルに文字を一つ一つ書き込むことは通常ない｡
極めて非効率的です｡
putc関数はfputcと同等です｡
これもよく使われているのを見かけますね｡
同じ引数を必要とし､ 戻り値の型も同じです｡
両者の違いは､ putcがマクロとして標準ライブラリに実装されている可能性があることです｡
一方､ fputcは関数なので｡
トンデモない違いですが､ マクロは習っていません｡
そこで､ 一文字を書くにはfputcにこだわることにします｡
そして､ 例として､ かなりわかりやすく説明しています｡
まず､ いつものようにファイルを開く必要があります｡
その前に､ 変数を宣言し､ ファイルポインタを宣言し､ NULLで初期化する必要があります｡
そして､ これから書く私たちの整数｡
ファイルを開くと､ wやwプラスをやっていることに気がつくと思います｡
Wは書き込みのみで､ 読み出しはできないという意味です｡
Wプラスは､ 書くことも読むこともできるということです｡
この場合､ 書き込みと読み出しができる｡
ここでは､ forループを使用しています｡
33から始まる全キャラクターを100まで通しで見ています｡
これが整数の場合､ どういうことかというと､ ASCII表で文字が表現されているのです｡
だから､ 例えば59という文字を書くと､ それが何を表しているかはASCII表で調べなければならないが､
実際の文字になる｡
ここでは､ ASCII値33から100を書き込むだけで､ fputc
char fpと言っています｡
また､ ASCII値や整数を作りたい場合は変換関数を使えばいいし､
アトイを使えばいいんです｡
つまり､ cという文字を書きたい場合は､ fputc atoiと言い､
cをシングルクォートで囲みます｡
それも､ ASCIIを整数に変換して書き込むからいいんだろうけど｡
しかし､ 第1引数は整数なので､ 整数を書かなければならない｡
第2引数はファイルポインターで､ これは非常に簡単です｡
そして最後に､ そのファイルを閉じなければなりません｡
また､ fpポインタをNULLに設定することも必要でしょう｡
しかし､ ここでも整数が必要です｡
だから､ そこには注意が必要です｡
常にASCII表で表現される｡
しかし､ 実際の文字を2つの整数に変換するには､ atoiを使用します｡
文字列をテキストファイルに書き込むのはどうでしょう｡
もっと便利で､ もっと効率的です｡
ここで､ fputs関数を使用します｡
これにより､ 任意のファイルやストリームに書き込むことができるようになります｡
fgetsと同じように､ 書きたい定数チャージ文字列をポインタの第1パラメータとして受け取ります｡
そして､ 2番目のパラメータとして､ 書き込み先のファイルポインタを受け取ります｡
そして､ intを返す｡
つまり､ 最初の引数は､ 書きたい文字列のポインタです｡
第2引数はファイルポインタそのものであり､ この関数は文字列からヌル末端に達するまで文字を書き込む｡
ヌルターミネーター文字をファイルに書き込まないため､ 明示的に書き込む必要があります｡
この場合､ データを読み出すときに可変長である可能性があり､ NULLターミネーターで終わらないため､
事態が複雑になる可能性があります｡
だから､ あなたは--最後に改行文字がある行を書くことを期待するのです｡
そのため､ ヌルターミネータについてよく理解し､
fputcを使用して明示的に1文字で記述するか､ 記述した後に基本的に改行文字を末尾に追加するようにしてください｡
だから､ その新しいラインキャラクターを期待しているのです｡
明示的に指定する必要があります｡
これは､ コード的にはかなりわかりやすい｡
fopenと言えばいいんでしょ｡
Fputs, ファイルポインタを用いて改行で文字列を書き込む｡
そして､ ここで別のfputsが別の文字列を書き込んでから､ それを閉じます｡
この場合､ 2つの文字列､ 実際には2行のコード､ または2行のファイルを書き､
wプラスでファイルを開いて､ 読み書きのためのものです｡
書き込みの例は､ かなりわかりやすいですね｡
fopenとfputs､ そしてfcloseという2つの関数を呼び出すだけです｡
さて､ フォーマットされた出力を書き出すには､ fprintfを使用します｡
繰り返しますが､ scanfによる読み込みと入力､ printfでは､
関数の前にfprefixを付けるだけで､ フォーマットされた出力が書き出されることにお気づきでしょう｡
そのため､ fprintfでフォーマットされた出力を書く場合は､ 整数を返します｡
ファイルストリームを第1引数にとり､ その後に形式指定子をカンマで区切って､
printfのように形式指定子ごとに可変個数の引数をとることができます｡
この関数の最初の引数は､ ファイルオブジェクトへのポインタである｡
そして､ 第2引数がそれらの可変個数です｡
空白文字､ 空白以外の文字､ 書式指定子のうち､
1つ以上を含むc文字列である｡
そしてまた､ printfと非常によく似ています｡
でも､ 実際にはファイルに書き込んでいるんですよね｡
だから､ フォーマットされた出力をファイルに書き込むことができる｡
成功すれば､ 書き込んだ文字数が返される｡
そうでなければ､ 成功しなかった場合､ 負の数を返すことになる｡
このような感じです｡
標準的なIOヘッダーが含まれていますね｡
ファイルポインタを作成するのです｡
そして､ ファイルポインタでテキストファイルを開き､ それをwプラスで読み書きに使って､
fprintfと言うだけです｡
この場合､ fprintfと言っています｡
ファイルポインタを指定し､ スペースとパーセントdで区切られた4つの文字列を指定しているのです｡
そして､ ハローと書いているのは､ 私の番号は555です｡
だから､ ファイルは書き込むときに実際にデータがフォーマットされることになるんだ｡
これをコードブロック化して見てみましょう｡
だから､ ここにはあまりコードがないんだ｡
コードは数行しかありません｡
4行目では､ ファイルポインタを作成しています｡
そしてまた､ これをnullに初期化したいと思います｡
そして､ 6行目でfopenを呼び出しています｡
そして､ ファイルを開くと言うのです｡ txtがあるので､ そのファイル｡ txtが存在し､ cソースファイルが実行されている場所か､
手動でプログラムを実行する場合は､ 実行ファイルがある場所でなければなりません｡
読み書きのために開放するのです｡
オープンした後､ ファイルポインタがヌルでないことを確認したい｡
だから､ not fpと言いたいのです｡
nullでなければ､ データの書き込みを開始することができます｡
そして､ 今回は9行目で､ フォーマットされたデータを書き込むことにしています｡
これから書くのは､ 1文字列､ 2文字列､ 3文字列､
4文字列､ そして整数の順です｡
そして､ 次のパラメータはカンマで区切られた文字列と､
最後に整数を指定するだけです｡
ただ､ このダブルクォーテーションがうまく機能しないので､ 555はそこの最後にあるのですが､
これを修正しなければなりません｡
そして､ そのファイルを閉じて返すのです｡
では､ これをビルドして実行してみましょう｡ 実行しても､ 実際に出力されるのは何もありません｡
ファイルがどのようなものか､ 見てみる必要がありそうです｡
ですから､ このファイルをコンパイルするときには､ if文にnot equal to
nullと書かれていることを確認する必要があります｡
これを実行すると､ やはり何も出力されず､ ただ実行されるだけです｡
そして､ ディレクトリの中のファイルを見ると､ 1行でhello my
name is fppとか､ at 555とか､ 入力が入っているのがわかります｡
というわけで､ 書式付き出力の書き方です｡
とてもわかりやすいですね｡
やろうと思えば､ 新しい行を追加することも可能です｡
最後に改行されますが､ ここにバックスラッシュnを入れることもできます｡
printfと同じように動作します｡
ここでも､ 実行しなければなりません｡ ファイルを見るまでは､ 面白い出力は見られません｡
そしてその場合､ 改行が表示されます｡
ですから､ ファイルへの出力の書き込みは非常に簡単です｡
文字を書きたいときはfputc､ 文字列を書きたいときはfputs､
書式付き出力はfprintfです｡
さらに慣れるための課題もありますが､
かなり簡単にテキストファイルに出力を書き出すことができます｡
ありがとうございます｡