bravoの日記: fopenのなぞ 2
fopen関数はよくつかわれるけど、"t"が付くのってなんだろうと思ったけど、ずばり「テキスト」モードらしい。が、glibc2.2.2のstdioライブラリfopen.cにはそんなモードは何処にもない。それより気になったのが、"x"モードだけど、どうやら排他モードとして予約(?)されてるみたい。
/* Dissect the given mode string into an __io_mode. */
int
__getmode (const char *mode, __io_mode *mptr)
{
register unsigned char i;
if (mode == NULL)
badmode ();
memset ((void *) mptr, 0, sizeof (*mptr));
switch (*mode)
{
case 'a':
mptr->__write = mptr->__create = mptr->__append = 1;
break;
case 'w':
mptr->__write = mptr->__create = mptr->__truncate = 1;
break;
case 'r':
mptr->__read = 1;
break;
default:
badmode ();
}
for (i = 1; i < 4; ++i)
{
switch (*++mode)
{
case '\0':
break;
case '+':
mptr->__read = mptr->__write = 1;
continue;
case 'b':
mptr->__binary = 1;
continue;
case 'x':
mptr->__exclusive = 1;
continue;
}
break;
}
if (!mptr->__read && !mptr->__write)
badmode ();
return 1;
}
fopen("foo.txt", "rt"); (スコア:1)
元々UNIX用として作られたCのライブラリは「改行とは0x0aである」ってことが前提になってます。これをMS-DOS/Windowsでも使えるようにするために作られたのがtモードです。
読み込みのときは自動的に0x0dを取って、書き込みのときは付加するようになってます。こうすることで、fopen以外の関数はUNIX用のやつがそのまま使えるってわけです。ほかにもバイナリであることを明示的に指定するbってのがあったはず。
Re:fopen("foo.txt", "rt"); (スコア:2)
CRLFって、テレタイプ時代の名残なんですよね...(テレタイプは見たことありませんが。)で、tty0とかってのもたしかTeleTYpeの意味だし...
# コメントさんくす。