開発環境
- OS X Lion - Apple(OS)
- TextWrangler(Text Editor) (BBEditの無料、light版)
- 言語: C
- コンパイラ: UNIX ccコンパイラ (汎用UNIX)
『実践プログラミング 第3版』 (Steve Oualline (著)、 望月 康司 (監修) (翻訳)、 谷口 功 (翻訳)、 オライリー・ジャパン、1998年、ISBN978-4900900646) の14章(ファイル入出力)14.3(行終端にまつわる謎)設問14-2を解いてみる。
設問14-2.
UNIXでは行終端に改行を使用している(\n)けど、MS-DOS/Windowsでは、改行と復帰の2文字を使用しているから、128バイトより1バイト多い129バイトになる。
余計な復帰を追加されないようにするために、ANCIIではなく、バイナリオプションを使用すれば、MS-DOS/Windowsでも問題はなくなる。(UNIXの場合、ANCIIもバイナリも違いはなので気にする必要はない。Windowsで環境を構築してないので以下はMacでの出力結果。)
修正。
バイナリオプション有り
コード(TextWrangler)
#include <stdio.h>
#include <stdlib.h>
#ifndef __MSDOS__
#include <unistd.h>
#endif /* __MSDOS__ */
int main()
{
int cur_char;
FILE *out_file;
out_file = fopen("test.out","wb");
if(out_file == NULL){
fprintf(stderr,"Cannot open output file\n");
exit (8);
}
for(cur_char = 0; cur_char < 128; ++cur_char){
fputc(cur_char, out_file);
}
fclose(out_file);
return (0);
}
入出力結果(Terminal)
$ cc -g -o sample sample.c
$ ./sample
$ cat test.out
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~$ ls -l test.out
-rw-r--r-- 1 kamimura staff 128 5 14 17:30 test.out
$
バイナリオプション無し
コード(TextWrangler)
#include <stdio.h>
#include <stdlib.h>
#ifndef __MSDOS__
#include <unistd.h>
#endif /* __MSDOS__ */
int main()
{
int cur_char;
FILE *out_file;
out_file = fopen("test.out","w");
if(out_file == NULL){
fprintf(stderr,"Cannot open output file\n");
exit (8);
}
for(cur_char = 0; cur_char < 128; ++cur_char){
fputc(cur_char, out_file);
}
fclose(out_file);
return (0);
}
入出力結果(Terminal)
$ cc -g -o sample sample.c
$ ./sample
$ cat test.out
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~$ ls -l test.out
-rw-r--r-- 1 kamimura staff 128 5 14 17:37 test.out
$
Macではバイナリオプション有り、無し共に出力結果(作成されるファイルのサイズ(128))は同じ。いずれWindowsでC言語の開発環境構築したら両方試してみることに。
0 コメント:
コメントを投稿