首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将int写入char数组/从char数组读取int

问将int写入char数组/从char数组读取int
EN

Stack Overflow用户
提问于 2014-11-08 02:40:22
回答 2查看 1.3K关注 0票数 0

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

这是我所拥有的

正在写入文件:

代码语言:javascript
复制
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); 

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

正在从文件读取:

代码语言:javascript
复制
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);

我试图读取整数的代码行给我一个编译器错误,显示为invalid type argument of unary '*' (have 'int')

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

EN

回答 2

Stack Overflow用户

发布于 2014-11-08 02:45:49

使用int val = *(int*)(buff2+1024)可以很容易地修复编译错误本身。

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

也就是说,除非底层HW体系结构以及手头指定的编译器支持未对齐的加载和存储操作(这主要是而不是的情况)。

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
char buff[1028] __attribute__ ((aligned(4)));

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

代码语言:javascript
复制
// Read 'int'
val = *(int*)(buff2+1024);

// Write 'int'
*(int*)(buff2+1024) = val;
票数 0
EN

Stack Overflow用户

发布于 2014-11-08 07:48:39

int val = *((int)((buff2+1023)+sizeof(int)));不会编译,因为它看起来像int val = *some_integer;,并且需要为int val = *some_integer_pointer;

按照@barak manos的建议,使用int val = *(int*)(buff2+1024)是很好的第一步。但它不能很好地处理内存对齐问题。

与其使用char*来表示“前1024个字符,下一个4个是整型”,不如使用一个结构。

代码语言:javascript
复制
typedef struct AD93 {
  char ch[1024];
  int val; // or int32_t
} AD93_T;

AD93_T buff2;
write(fd2, &buff2, sizeof buff2);

read(fd2, &buff2, sizeof buff2);
printf("%d\n", buff2.val);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26807904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档