パスワードを忘れた? アカウント作成
451109 journal

bravoの日記: fopenのなぞ 2

日記 by bravo

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;
}

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • 元々UNIX用として作られたCのライブラリは「改行とは0x0aである」ってことが前提になってます。これをMS-DOS/Windowsでも使えるようにするために作られたのがtモードです。

    読み込みのときは自動的に0x0dを取って、書き込みのときは付加するようになってます。こうすることで、fopen以外の関数はUNIX用のやつがそのまま使えるってわけです。ほかにもバイナリであることを明示的に指定するbってのがあったはず。

typodupeerror

アレゲは一日にしてならず -- アレゲ見習い

読み込み中...