gpt4 book ai didi

c - 将 int 写入 char 数组或从 char 数组读取 int

转载 作者:行者123 更新时间:2023-11-30 17:26:25 26 4
gpt4 key购买 nike

我正在尝试编写一个程序,可以将 int 复制到 char 数组中,然后将该 char 数组写入使用 write 系统调用创建文件。在另一个程序中,我想将文件的内容读入 char 数组,然后从数组中检索 int 。我无法理解的是如何将 int 的内容写入数组以及如何从 char 数组中读取 int

这是我所拥有的

写入文件:

int fd2 = open("file2.txt", O_RDWR | O_CREAT, S_IRUSR | S_IRGRP | S_IROTH); 
//create buff2 with 1024 chars and last 4 bytes as int
write(fd2, buff2, 1028);

我不确定如何准确实现注释行

从文件中读取:

int fd2 = open("file2.txt", O_RDWR | O_CREAT, S_IRUSR | S_IRGRP | S_IROTH); 
char buff2[1028];
read(fd2, buff2, 1028);
int val = *((int)((buff2+1023)+sizeof(int))); // file contains exactly 1028 bytes. first 1024 are characters, next 4 is int
printf("%d\n", val);

我尝试读取整数的行给了我一个编译器错误,指出一元'*'的无效类型参数(有'int')

如果有任何帮助,我将不胜感激

最佳答案

编译错误本身可以通过 int val = *(int*)(buff2+1024) 轻松修复

但是,如果您尝试从不能被 sizeof(int) 整除的地址读取/写入 int 值,那么您将简单地得到错误的结果,或者更糟 - 内存访问冲突。

也就是说,除非底层硬件架构以及指定的编译器支持未对齐的加载和存储操作(大多数情况不是)。

由于您不知道 buff2 的地址,因此无法确定 buff2+1024 指向的地址可以被 sizeof(int) 整除。因此,您必须一次读取/写入 int 值一个 char:

char* pVal = (char*)&val;

// Read 'int' on little-endian architecture
for (i=0; i<sizeof(val); i++)
pVal[i] = buff2[1024+i];

// Read 'int' on big-endian architecture
for (i=0; i<sizeof(val); i++)
pVal[sizeof(val)-1-i] = buff2[1024+i];

// Write 'int' on little-endian architecture
for (i=0; i<sizeof(val); i++)
buff2[1024+i] = pVal[i];

// Write 'int' on big-endian architecture
for (i=0; i<sizeof(val); i++)
buff2[1024+i] = pVal[sizeof(val)-1-i];
<小时/>

如果将 buff2 声明为全局变量,则可以强制编译器在对齐的内存地址处分配它。例如,假设您的平台上有 sizeof(int) == 4:

char buff[1028] __attribute__ ((aligned(4)));

然后,您可以安全地从任何可被 sizeof(int) 整除的偏移量中读取/写入 int 值:

// Read 'int'
val = *(int*)(buff2+1024);

// Write 'int'
*(int*)(buff2+1024) = val;

关于c - 将 int 写入 char 数组或从 char 数组读取 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26807904/

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