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

时间:2012-01-05 13:38:21

标签: c windows mingw

我想使用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,我找不到我做错了什么。有没有人有任何线索?

修改

谢谢你的提示!这是问题中的拼写错误(我已经纠正过了)。它在源头是正确的 代码。

4 个答案:

答案 0 :(得分:8)

void read_file(const char filename)

然后再说:

int fd_in = open(filename, O_RDONLY, 0x00644);

不要忽略编译器警告。我很惊讶这不只是崩溃。

答案 1 :(得分:8)

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

你需要查看你的开放模式 - O_BINARY。在PHP中,这就是你必须使用模式“rb”(READ BINARY)而不是“R”(“R”默认为READ TEXT)的原因。

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中处理这个问题

答案 2 :(得分:1)

您可以尝试在公开通话中使用O_RDONLY | O_BINARYO_RDONLY | O_NOTRANS。通过不指定O_BINARY或O_NOTRANS,可以在文本模式下打开文件,并在第一次遇到EOF字符时停止读取。

答案 3 :(得分:0)

我在我的机器上尝试了你的代码:

  • Windows 7,
  • Cygwin截至今日的最新版本,
  • gcc(GCC)3.4.4(cygming special,gdc 0.12,使用dmd 0.125))

它适用于我的机器上的示例文件。我在cmd.exe中读取的文件是C:\Windows\System32,我将read_file函数的总字节数与磁盘上的实际文件大小进行了比较。

这表明了两件事之一:

  • 您要打开的文件有一些特别之处。也许它处于一个奇怪的锁定状态,你得到一些错误(虽然从未听说过)或者文件在磁盘上损坏(其他程序可以访问它吗?尝试将其复制到另一个文件夹)
  • 您的代码中有些内容不在导致问题的问题中