C 文字列操作 新しいページはコチラ
提供: yonewiki
(→文字列ファイルへの入出力) |
(→文字列ファイルへの入出力) |
||
4,899行: | 4,899行: | ||
fclose(pfileText); | fclose(pfileText); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | 先述の読み込み処理に続けてのプログラムになります。ファイルオープンモードでwを指定して、fputs関数でchar型の書き込み、fputwsでwchar_t型の書き込みをするような形式です。モードaで追記なのでファイル末尾から追記されます。ファイルの先頭に追加するときはBOMコードの後の所にファイルポジションをfsetpos関数で移動してからfputws/fputsで書き込むと良いでしょう。新規のファイル作成となるモードwのバイナリモードwbでは、BOMコードを付与しなければならないケースも出てきます。fputsでBOMコードを保持した文字列を引数にすると良いです。bを付けないテキストモードでの書き込みでは、ccs=UTF-8やccs=UTF-16LEを指定すると自動でBOMコードを追記してくれますので、そのままUTF-16ならwchar_t型の文字列を書き出せばよいです。但し、バイナリモードで読み込んだ文字列は\r\nがそのまま文字列になっているので、書き出し時に後ろの\nが\r\nに変換され、\r\r\nになってしまうので、バイナリモードで読み込んだ文字をテキストモードで書き出すのはやめた方がいいです。どうしても相互乗り換えするのであれば、改行コードの置換処理が必要です。UTF-8のテキストモード書き込みでもユニコードのUTF-16LE形式で書き込むことでUTF-8に変換されますので、プログラム内部ではUnicodeで文字列を扱った方が効率が良いと思います。テキストモードでサポートしない文字コードのような特殊な形式に変換する場合はバイナリモードで文字列を読み込んで、変換処理を実施し、char型に格納した文字コードをバイナリモードで書き出すと良いでしょう。サンプルプログラムではテキストモードで読み込んだJIS文字をUnicodeに変換しUTF-16テキストモードで書き込んだ失敗例をプログラムにしてあります。ファイルオープンモードをうまく使いこなすことと、Unicode以外の文字列はchar型でバイナリとして扱うところがポイントです。変換処理はICUに任せればかなり柔軟な入出力処理が作れると思います。 | |
+ | |||
+ | |||
+ | ファイルオープンモードについてですが、r、w、a、rb、wb、ab の他にもr+ のように+記号を付けるパターンがあります。この場合、r+ 既存ファイルに読み込み上書き、w+ 新規ファイルで読み書き、a+ 既存ファイルに読み追記ができます。cをつけるとflush関数による反映ですべての操作が確定しファイルに反映するモードになります。通常はcではないモードのnが規定値になっています。bを指定しない場合も実際はtが規定値として扱われています。他にもディスクにファイルを残さずメモリ上だけでファイルの操作をするためにT(ファイル生成されない)やD(ファイルポインタを閉じると削除されるファイル)といった一時ファイル指定もありますし、シーケンシャルアクセス最適化のSにランダムアクセス最適化のR、子プロセスに継承しないNといった非常に難しいコアなオプションもあります。 | ||