gpt4 book ai didi

c - read() 只从文件中读取几个字节

转载 作者:可可西里 更新时间:2023-11-01 09:39:34 25 4
gpt4 key购买 nike

我想使用 read() 函数读取文件的内容。我尝试了以下方法:

#define BUFFER_LENGTH (1024)

char buffer[BUFFER_LENGTH];

// The first version of the question had a typo:
// void read_file(const char filename)
// This would produce a compiler warning.
void read_file(const char *filename)
{
ssize_t read_bytes = 0;

// The first version had the mode in hex instead of octal.
//
// int fd_in = open(filename, O_RDONLY, 0x00644);
//
// This does not cause problems here but it is wrong.
// The mode is now octal (even if it is not needed).
int fd_in = open(filename, O_RDONLY, 0644);
if (fd_in == -1)
{
return;
}

do
{
read_bytes = read(fd_in, buffer, (size_t) BUFFER_LENGTH);
printf("Read %d bytes\n", read_bytes);

// End of file or error.
if (read_bytes <= 0)
{
break;
}
} while (1);

close(fd_in);
}

我在 Windows 7 系统上使用“gcc (GCC) 3.4.2 (mingw-special)”。

我得到的奇怪行为是没有阅读所有内容。例如,我有一个文件

05.01.2012  12:28            15.838 hello.exe

当我尝试阅读它时,我得到:

Read 216 bytes
Read 0 bytes

据我所知,read() 应该一直读到文件末尾。虽然确实它在第二次调用时报告文件结尾 (0)?

也许我遗漏了一些明显的东西,但我看不到它。我读过this documentthis document一遍又一遍,我找不到我做错了什么。有人知道吗?

编辑

感谢指点!这是问题中的错字(我已更正)。来源是正确的代码。

最佳答案

我怀疑字节 217 是 EOF (26, 0x1A) - 在 Windows 中,文件可以“文本”或“二进制”模式打开。在文本模式下,0x1A 被解释为 EOF。

您需要查看您的打开模式 - O_BINARY。在 PHP 中,这就是为什么您必须使用模式“rb”(读取二进制)而不是“R”(“R”,默认为读取文本)的原因。

http://www.mingw.org/wiki/FAQ说标志是 O_BINARY(靠近页面底部),所以你需要

int fd_in = open(filename, O_RDONLY | O_BINARY, 0644);

http://cygwin.com/faq.html第 5.3 段告诉你如何在 cygwin 中处理这个问题

关于c - read() 只从文件中读取几个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8743467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com