【发布时间】:2017-09-23 20:25:47
【问题描述】:
我正在读取二进制文件并将数据添加到 RB 树。在我的文件中,前四个字节是一个 IP 地址,接下来的四个字节是一个数字,接下来的 x 个字节是一个以空字符结尾的字符串。
我意识到我应该读取缓冲的字节数,然后对其进行处理,但这是针对我们正在逐步设计的项目(因此下一步)。所以目前我正在做的是一次读取一个字节并处理它,直到我读取一个空字符。
我的代码的相关部分如下所示:
int fd, i, check, numNames;
unsigned char fourBytes[4];
char curChar;
char buffer[255];
fd = open("converted", O_RDONLY);
check = read(fd, fourBytes, 4);
if(check < 4) break;
strcpy(m->ip, fourBytes);
check = read(fd, fourBytes, 4);
if(check < 4) break;
numNames = *(int *)fourBytes;
// I have a loop here but in the scheme of my current issue it doesn't matter
check = read(fd, curChar, 1);
最后一行是我的问题所在,curChar 不包含下一个字节,它包含一个空字符(即使我知道下一个字节不为空)。为什么是这样?我尝试过使用 memset() 来处理我的数据类型、缓冲区大小以及其他一些愚蠢的事情。我对系统调用不是很熟悉,所以我不太确定从哪里开始。
非常感谢任何帮助。
【问题讨论】:
-
你不能像这样将指针转换为
int *,这是一个别名错误。您必须使用 memcpy 或联合。 -
另外
strcpy(m->ip, ...)是错误的,因为fourBytes肯定不是空终止符。 -
(相反,您应该直接阅读
m->ip、&numNames...) -
我不确定这是否与我的问题有关,因为它确实有效。我只是将类型转换为一个 int 数组,然后取消引用。我会尝试以不同的方式进行操作,但出于所有意图和目的,该部分在我的程序中确实有效。
-
@AnttiHaapala 此外,我实际上确实向该数组添加了一个空字符,我只是没有将它包含在我提供的代码中。我几乎 100% 确定最后一行是我真正的问题所在。
标签: c system-calls