📜  PHP中的fopen模式“r+”、“rw+”和“w+”有什么区别?

📅  最后修改于: 2022-05-13 01:56:25.726000             🧑  作者: Mango

PHP中的fopen模式“r+”、“rw+”和“w+”有什么区别?

在制作应用程序时,文件处理是编程中非常重要的一部分。我们可能需要从文件中读取输入或将输出写入文件。 PHP中的文件处理类似于其他编程语言。有一些预定义的函数可用于完成指定的任务。查看文件处理基础知识以了解这些功能。

句法:

$ = fopen(,)

PHP中fopen模式r+、rw+和w+的区别

  • r+:以读写模式打开文件。文件指针从文件的开头开始。
  • w+:以读写模式打开文件。如果文件不存在,则创建一个新文件,如果存在,则擦除文件内容,文件指针从头开始。
  • rw+:以读写模式打开文件。文件指针从文件的开头开始。 PHP文档中不存在这种模式,但它运行良好。

示例:为了更好地理解,让我们观察 fopen 的解析函数。

  • 它检查参数的第一个字符,即模式[0]。根据它是 r、w、a 或 x,识别相应的模式。
  • 它在模式参数中查找“+”的存在。如果存在,它会设置适当的标志。

因此, “r+”“w+”在打开文件和放置文件指针的方式上是有区别的。 “r+”“rw+”是一样的。 PHP只关心字符串是否以“r”开头并带有“+”“w”“rw+”中被忽略。因此,它们的工作方式相同。

PHPAPI int php_stream_parse_fopen_modes(const char *mode, int *open_flags)
{
    int flags;
  
    switch (mode[0]) {
        case 'r':
            flags = 0;
            break;
        case 'w':
            flags = O_TRUNC|O_CREAT;
            break;
        case 'a':
            flags = O_CREAT|O_APPEND;
            break;
        case 'x':
            flags = O_CREAT|O_EXCL;
            break;
        case 'c':
            flags = O_CREAT;
            break;
        default:
            /* unknown mode */
            return FAILURE;
    }
  
    if (strchr(mode, '+')) {
        flags |= O_RDWR;
    } else if (flags) {
        flags |= O_WRONLY;
    } else {
        flags |= O_RDONLY;
    }
  
#if defined(O_CLOEXEC)
    if (strchr(mode, 'e')) {
        flags |= O_CLOEXEC;
    }
#endif
  
#if defined(O_NONBLOCK)
    if (strchr(mode, 'n')) {
        flags |= O_NONBLOCK;
    }
#endif
  
#if defined(_O_TEXT) && defined(O_BINARY)
    if (strchr(mode, 't')) {
        flags |= _O_TEXT;
    } else {
        flags |= O_BINARY;
    }
#endif
  
    *open_flags = flags;
    return SUCCESS;
}