在Windows上用C++打开文件的不同方式?

4
当使用fopen或fstream时,需要指定二进制模式以防止字符转换。在类Unix系统上,这通常是不必要的,但在Windows上是必需的。
这让我想知道,在该操作系统上访问文件系统数据是否仍然是“自然”的方式。UNIX具有“所有内容都是文件”的架构,那么是否有Windows等效的更低级别的设备来访问数据?毕竟,如果存在字符转换,则涉及检查每个字符以查看是否需要转换的开销。希望以二进制模式打开文件只会禁用任何此类处理,但我有疑虑。
谁能为此提供一些说明?

1
我只想说,虽然这是一个值得回答的有效问题,但你对这种方法的理解似乎带有过早优化的味道。 - Nate C-K
Windows 对字符转换一无所知,这纯粹是 CRT 实现细节。 - Hans Passant
2
Nate,你可能是对的。我并不打算真正解决这个“问题”,因为它可能并不是一个问题。但我想知道引擎内部发生了什么。 - Steven Lu
我希望人们不要再纠结于过早优化了,这已经老掉牙了。 - markh44
3个回答

2
你可以使用Windows文件句柄。使用CreateFileReadFileWriteFile函数。这与Unix的做法非常相似,许多操作都可以使用这些函数完成,但不包括套接字,这是最接近的方法!

1

是的,有一些Win32特定的函数。纯粹主义者会说这会使你的代码不可移植。而且确实如此!但谁在乎呢,你正在编写一个Windows程序。

OpenFile, CreateFile, etc


如果你在意的话,你可以编写一个简单的包装函数,在编译时检查Windows API是否可用。 - user142019
运行Linux或Mac OS的人们很在乎! :-) - Emile Cormier

1

C运行时库执行C运行时库的功能。

实际上,Windows将大多数东西作为文件(或者我应该说对象)处理。在Windows中,文件名实际上是全局命名空间\??\中的一个对象。如果您查找MSDN上的CreateFile文档,会发现其中有更多内容,特别是如果您深入挖掘Windows内核文档

如果您对Windows上的对象感到好奇,还可以从technet下载并运行WinObj

根据您正在开发的项目类型,我建议在IO周围放置一个抽象层,以便能够充分利用Windows中但不在C运行时库中的内容。我很少编写不通过每个平台上的本机API(或通过某些中介抽象)的不同平台的代码。


不是挑剔,但你最后一句话是什么意思?还有哪些东西会“在Windows中但不在C运行时库中”? - Steven Lu
听起来他想要利用操作系统提供的文件系统功能,而不是依赖于标准的C库,这种方法有点像最低公共分母。 - Nate C-K
@Steven Lu,是的,Nate C-K说得对,Windows API中有很多东西没有通过C运行时库公开。例如异步IO和内存映射以及锁定文件的区域的能力。对于日常使用来说这并不是必要的,但它是强大的功能,存在于大多数操作系统中,但不在C运行时库中。 - John Leidegren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接