使用系统调用write,我正在尝试将一个数字写入文件。我希望fileid指向的文件有4为'04'(预期结果)。
unsigned int g = 4;
if (write(fileid, &g, (size_t) sizeof(int) ) == -1)
{
perror("Error"); exit(1);
}
我的文件输出'0000 0004'。如果我把一个而不是sizeof(int)我得到00。
我错过了哪种特定类型?
PS。我也必须从文件中读取这个值,所以如果没有类型,我不太清楚我会怎么做。
答案 0 :(得分:3)
如果写{1}}的1个字节将打印00或04将取决于架构。通常,32位整数将使用little-endian存储在存储器中,这意味着较低有效字节首先出现,因此32位g
4存储为04 00 00 00且第一个字节为04。 / p>
但这并非总是如此。一些架构将使用big-endian存储,因此内存中的字节顺序与32位十六进制00 00 00 04中的读取相同。
答案 1 :(得分:2)
sizeof(int)将返回4;所以实际上,代码写了四个字节。
从
更改'g'的类型unsigned int
到
unsigned char
...并且,更改
sizeof(int)
到
sizeof(unsigned char) .. or sizeof(g)
然后你应该看到只写一个字节'04'。
答案 2 :(得分:0)
在这种情况下,我建议使用在uint8_t
中定义的<stdint.h>
。在你将遇到的基本上所有系统上,这是unsigned char
的typedef,但使用此名称可以更清楚地将变量中的值视为数字,而不是字符。
uint8_t g = 4;
if (write(fileid, &g, 1) != 1) {
perror("write");
exit(1);
}
(根据定义sizeof(char) == 1
,因此sizeof(uint8_t)
也是如此。)
要了解原始代码的行为与预期不符的原因,请阅读endianness。
答案 3 :(得分:0)
如果只想保存一个字节,那么创建一个大小为一个字节的变量并使用write
保存它更合适。
unsigned int g = 4;
unsinged char c = (unsigned char)g;
if (write(fileid, &c, 1 ) == -1)
{
perror("Error"); exit(1);
}
如果您丢失了任何数据,它将在程序中,而不是文件的进/出。