【问题标题】:write() not writing correct amout of bytes on windows in Cwrite() 没有在 C 中的窗口上写入正确数量的字节
【发布时间】:2012-06-09 19:03:35
【问题描述】:

在 Windows 下将值写入 C 中的文件时,我得到的东西似乎是错误的,结果与在 Cygwin 中运行的同一程序不同。

在这种情况下,我将浮点数写入文件:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>

int         main( void )
{
    int     fd;
    float   f;

    fd = open("file.a", O_RDWR | O_CREAT);
    f = (float)atof("-0.1352237");
    printf("%.7f\n", f);

    write(fd, (void *)&f, sizeof(float));
    close(fd);
    printf("sizeof(float): %d\n", sizeof(float));

    return (EXIT_SUCCESS);
}

我已经在 Windows 和 Cygwin 中编译并运行了这个文件(没有包含),但我没有得到相同的结果。由于我正在写一个浮点数,我希望输出文件有 4 个字节写入它

但是,在命令行中使用 cl.exe 编译时的输出似乎是错误的:

1578 0d0a be

如果我从文件中读取到浮点数,显然我没有得到正确的值。而且写入文件的字节数是错误的,应该只有4个字节,而不是5个。

这是我在 Cygwin 中运行时得到的:

1578 0abe 

这是正确的。如果我从文件中读取到浮点数,我会得到正确的值 (-0.1352237)。

我在这里遗漏了什么吗?这些功能的windows实现是否有缺陷? 或者我没有正确写入数据?

【问题讨论】:

    标签: c windows gcc cl.exe


    【解决方案1】:

    您已以文本模式(默认)打开文件,因此 0a ("\n") 正在转换为 0d0a ("\r\n")。

    您需要使用O_BINARY 标志以二进制模式打开文件。

    【讨论】:

    • 多么基本的错误!谢谢,这解决了问题,并且有意义。但是为什么要写一个 \n 呢?它被写在两个字节之间。
    • 因为\n 的ASCII 值是0a(即十进制的10)。您的一个字节恰好具有该值。
    • 好吧,有道理,我明白我做错了什么。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2016-02-19
    • 2014-12-14
    • 2015-02-16
    • 1970-01-01
    相关资源
    最近更新 更多