2017-09-23 78 views
-2

我正在阅读二进制文件并将数据添加到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()以及其他愚蠢的东西来搞乱。我对系统调用不是很熟悉,所以我不太确定从哪里去。

任何帮助,非常感谢。

+0

你*不能*像这样投射指向'int *'的指针,这是一个别名错误。您必须使用memcpy或联合。 –

+0

另外'strcpy(m-> ip,...)'是错误的,因为'fourBytes'肯定不是空终止的。 –

+0

(相反,你应该直接阅读'm-> ip','&numNames' ...) –

回答

1

正如你在这里给它,curCharchar,但你把它传递给read(2)就好像它是一个char*。既然你没有提到获得一个SIGSEGV,我敢肯定这不是你的实际代码...

+0

这是一条评论,而不是答案。 –

+0

它确实解决了实际问题:“curChar不包含下一个字节,它包含一个空字符(...),为什么是这样?”。我添加了第二句,仅仅是为了解释解释和代码一样是错误的。 –

+0

在我见过的每个例子中,如果你只读一个字节,你不必读取char *。将curChar更改为char *并为其调用一个字节并不能解决我的问题。 –

相关问题