作为学习练习,我正在try 用C语言为Windows和GNU/Linux操作系统编写平台层.

我目前感兴趣的是实现一个函数,该函数在主机平台上以提供的模式打开文件,类似于<stdio.h>中的fopen.我知道<fileapi.h>中有Windows API函数CreateFile,<fcntl.h>中有GNU函数open;我想我可以使用它们从磁盘打开文件进行读或写.但是,fopen还提供了在以二进制模式打开文件和以文本模式打开文件之间的模式 Select .我不完全理解它们之间的区别是如何在幕后工作的;我该如何在我的版本中实现这一功能呢?

推荐答案

不完全理解这些差异是如何在幕后运作的;

当代码使用"b"打开一个文件时,有no翻译. 文件中的内容就是读取的内容. 写入文件的内容都已写入.

When code does not use "b" to open a file, there is a potential translation. An outgoing "\n" may get translated into "\r\n", "\r", "\n" or something else. The last write may append a Ctrl z or not. The beginning of the file may include a BOM. Other translations are possible. Reading of such files may consume the above mentioned and present the code with less info. There are many implementation specific aspects to reading and writing such a text file.

读/写text文件时,不要使用"b".否则,不要以"b"开头.


我该如何着手在我的版本中实现此功能?

如果读取text文件,请不要使用"b",否则使用"b".

C++相关问答推荐

我可以动态分配具有空类型函数的矩阵吗?

C:gcc返回多个错误定义,但msvc—不""'

括号中的堆栈实现错误问题

ARM64 ASIMD固有的加载uint8_t* 到uint16x8(x3)?

如何将字符串传递给函数并返回在C中更改的相同字符串?

在C++中通过空指针隐式访问常量变量的值

C指针概念分段故障

==284==错误:AddressSaniizer:堆栈缓冲区下溢

For循环中的变量行为不符合预期.[C17]

在txt文件中找到指定的字符串,并从数字中减go 相同的值

如何在C-函数中混合使用C代码和ASM?

Cairo STM32MP1 cairo_Surface_WRITE_TO_PNG始终返回CAROLIO_STATUS_WRITE_ERROR

C语言中的外部关键字

循环中的静态变量与块中的变量和循环

如何读取程序中嵌入的数据S自己的ELF?

如何在C中定义指向函数的指针并将该指针赋给函数?

向左移位3如何得到以字节为单位的位数?

为什么GCC 13没有显示正确的二进制表示法?

Ubuntu编译:C中的文件格式无法识别错误

为什么 int32_t 和 int16_t 在 printf 输出中具有相同的位数?