我正在尝试编写一个程序,在该程序中,我可以将int复制到char数组中,然后使用write系统调用将该char数组写入文件。在另一个程序中,我想将文件内容读入char数组,然后从数组中检索int。我很难理解的是如何将int的内容写入数组,以及如何从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);我试图读取整数的代码行给我一个编译器错误,显示为invalid type argument of unary '*' (have 'int')
如果有任何帮助,我将不胜感激。
发布于 2014-11-08 02:45:49
使用int val = *(int*)(buff2+1024)可以很容易地修复编译错误本身。
但是,如果您尝试从/向一个不能被sizeof(int)整除的地址读/写int值,那么您将得到错误的结果,或者更糟--内存访问冲突。
也就是说,除非底层HW体系结构以及手头指定的编译器支持未对齐的加载和存储操作(这主要是而不是的情况)。
由于您不知道buff2的地址,因此无法确保buff2+1024指向可被sizeof(int)整除的地址。因此,您必须一次读/写一个char的int值:
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;发布于 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个是整型”,不如使用一个结构。
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);https://stackoverflow.com/questions/26807904
复制相似问题