C read()看到空字符而不是正确的字节

C read()看到空字符而不是正确的字节,c,system-calls,C,System Calls,我正在读取一个二进制文件,并将数据添加到RB树中。在我的文件中,前四个字节是ip地址,下四个字节是数字,下一个x字节是以空字符结尾的字符串 我意识到我应该读取缓冲的字节数,然后进行处理,但这是一个我们正在增量设计的项目(下一步就是这个步骤)。所以目前我正在做的是一次读取一个字节并处理它,直到我读取一个空字符 以下是我的代码的相关部分: int fd, i, check, numNames; unsigned char fourBytes[4]; char curChar; char buffer

我正在读取一个二进制文件,并将数据添加到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);
intfd,i,check,numNames;
无符号字符四字节[4];
半焦半焦;
字符缓冲区[255];
fd=打开(“转换”,仅限Ordu);
检查=读取(fd,四字节,4);
如果(检查<4)断裂;
strcpy(m->ip,四字节);
检查=读取(fd,四字节,4);
如果(检查<4)断裂;
numNames=*(int*)四字节;
//我在这里有一个循环,但在我当前发行的方案中,它并不重要
检查=读取(fd,curChar,1);
最后一行是我的问题所在,curChar不包含下一个字节,它包含一个空字符(尽管我知道下一个字节不是空的)。为什么会这样?我尝试过处理我的数据类型、缓冲区大小、使用memset()等等愚蠢的事情。我不太熟悉系统调用,所以我不太确定从这里开始该怎么做


非常感谢您提供的任何帮助。

正如您在这里提供的一样,
curChar
是一个
char
,但您将它传递给
read(2)
就像它是一个
char*
一样。由于您没有提到获取SIGSEGV,我肯定这不是您的实际代码…

您不能像这样将指针投射到
int*
,这是一个别名错误。您必须使用memcpy或union。另外,
strcpy(m->ip,…)
是错误的,因为
fourBytes
肯定不是以null结尾的stirng。(相反,您应该直接读取
m->ip
和numNames
。)我不确定这是否与我的问题有关,因为它确实有效。我只是对一个int数组进行类型转换,然后取消引用。我将尝试以不同的方式执行此操作,但出于所有目的,该部分在我的程序中确实起作用。@AnttiHaapala而且我确实向该数组添加了一个空字符,我只是没有在提供的代码中包含它。我几乎100%确定最后一行是我真正的问题所在。这是一个注释,不是答案。它确实解决了实际问题:“curChar不包含下一个字节,它包含一个空字符(…)。这是为什么?”。我添加第二句只是为了解释解释和代码都是错误的。在我看到的每个示例中,如果只读取一个字节,则不必读取字符*。将curChar改为char*并调用一个字节并不能解决我的问题;读取(fd和c,1)&组成一个
字符*
。看起来你完全正确,我很尴尬我没有意识到这一点。我对C语言编程很陌生,所以谢谢你没有责骂我哈哈。