【问题标题】:read in mingw under windows does not read entire file. Why?在 windows 下的 mingw 中读取不会读取整个文件。为什么?
【发布时间】:2021-05-26 14:45:37
【问题描述】:

在windows下使用mingw,下面在linux下运行的代码不起作用:

int fh = open(filename, O_RDONLY);
const int size=100000;
int bytesRead = read(fh, buffer, size);

文件大于 100k,但读取的字节数仅为 232。我认为这与 windows 中的二进制文件有关?

这个带有 ifstream 的代码可以在 windows 和 Linux 中运行。

ifstream in(filename, ios::binary);
const int size=100000;
in.read(buffer, size);

有没有办法让 2 级 IO 调用也可以在 Windows 上工作?

【问题讨论】:

  • 你试过O_RDONLY | O_BINARY吗?我怀疑二进制文件的字节 232 被错误地检测为文件结尾(在 Windows 中)。我在这里和那里看到过O_BINARY,但找不到像“权威”文档这样的东西。
  • 我通常google man open,没有意识到兼容性功能不兼容。您在哪里可以找到文档?

标签: c++ file mingw binaryfiles


【解决方案1】:

阅读手册是非常有用的技术。

_read

返回值

_read 返回读取的字节数,可能小于 buffer_size 如果文件中剩余的字节数少于 buffer_size,或者如果文件以文本模式打开。在文本模式下,每个回车换行符对 \r\n 被替换为单个换行符 \n。返回值中仅计算单个换行符。替换不影响文件指针。

Text and Binary Mode File I/O

文件 I/O 操作以两种翻译模式之一进行,文本或二进制,具体取决于打开文件的模式。数据文件通常以文本模式处理。

  • 使用函数_set_fmode 更改新打开文件的默认模式。使用_get_fmode 查找当前默认模式。 初始默认设置为文本模式 (_O_TEXT)

  • 通过在你的程序中设置全局变量_fmode直接改变默认翻译模式。函数_set_fmode设置这个变量的值,也可以直接设置。

open(filename, O_RDONLY); 默认在 Windows 中以文本模式打开文件。

open(filename, O_RDONLY | O_BINARY); 在 Windows 中以二进制模式打开文件,如果文件中剩余足够的字节,read 将进一步读取所有请求的字节。

【讨论】:

  • 我使用 man 2 open 查找了 open 函数,这当然不会显示不兼容。您指的手册在哪里?
  • @Dov 为什么在为 Windows 编程时阅读 Linux 手册页?
  • 你指的手册又在哪里?搜索 mingw 库文档 open read ... 没有找到答案。我一直认为这些功能与 linux 相同,因为这是它们的目的。大多数是。您是在尝试提供答案还是对批评更感兴趣?
  • 如果您在建议中看到批评,我很抱歉。 google.com/search?q=win32+read,第一个链接read_
猜你喜欢
  • 2014-05-18
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
相关资源
最近更新 更多