使用"写"写一个字节系统调用C语言

时间:2014-04-26 03:06:42

标签: c system-calls

使用系统调用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。我也必须从文件中读取这个值,所以如果没有类型,我不太清楚我会怎么做。

4 个答案:

答案 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中的读取相同。

Wikipedia Article

答案 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);
}

如果您丢失了任何数据,它将在程序中,而不是文件的进/出。