【问题标题】:Is open() cross-platform in C?C 语言中的 open() 是跨平台的吗?
【发布时间】:2021-02-03 22:20:15
【问题描述】:

基本上是标题。 open()是跨平台的吗?我个人更喜欢将标志与| 结合使用而不是字符串,所以我可以只使用open() 代替吗?它会在fopen() 的任何地方工作吗?

【问题讨论】:

  • 如果您使用 C 进行编程,并且想要最大的可移植性,那么您需要 fopen。也就是说,open 非常受欢迎,并且几乎可以在任何地方使用;很难想象你可能会真正找到fopen 可用但open 不可用的环境。
  • 这里真正的权衡不是在文件打开模式之间作为按位 or-able 标志与字符串,甚至整数文件描述与FILE *。真正的权衡是缓冲。如果你知道你不想要缓冲,你想要open。但是缓冲通常是一种胜利,如果您使用open 并且不小心执行 I/O,您最终可能会得到一个效率显着低下的程序。例如,如果您调用了open,但您想要getchar,并且您使用read(fd, &c, 1) 进行模拟,那么您最终会以最低效的方式读取文件。
  • @SteveSummit 我什么时候想要或不想要缓冲?
  • @user15119853 简短回答:如果你不知道,你想要它。
  • 稍微长一点的答案:如果您有一个不是文件的文件描述符(可能是网络套接字),您通常不需要缓冲。如果您有一个文件要一次读取或写入大型、相同大小、文件系统兼容的块(1024 字节、8192 字节等),并且您有高性能需求,则可能不需要缓冲.否则,如果您正在读取/写入小的或随机大小的文本片段——这里几个字符,那里几个字符,或者一次随机长度的行,或者类似的东西——你可能需要缓冲。

标签: c file cross-platform


【解决方案1】:

open()POSIX 规范的一部分,因此它可以在任何实现这一点的环境中工作。这包括所有现代风格的 Unix(POSIX 源自 Unix)以及 Windows。因此,您应该能够在您可能遇到的任何还提供托管 C 实现的平台上使用它(所以不是微控制器,但它可能也不会有 fopen())。

如果您想要一个FILE *,然后您可以将其与所有其他stdio 函数(例如fprintf())一起使用,您可以使用fdopen()open() 返回的FD 中获取它。

【讨论】:

    猜你喜欢
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多