【问题标题】:read() seeing null character instead of proper byteread() 看到空字符而不是正确的字节
【发布时间】: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-&gt;ip, ...) 是错误的,因为fourBytes 肯定不是空终止符。
  • (相反,您应该直接阅读m-&gt;ip&amp;numNames...)
  • 我不确定这是否与我的问题有关,因为它确实有效。我只是将类型转换为一个 int 数组,然后取消引用。我会尝试以不同的方式进行操作,但出于所有意图和目的,该部分在我的程序中确实有效。
  • @AnttiHaapala 此外,我实际上确实向该数组添加了一个空字符,我只是没有将它包含在我提供的代码中。我几乎 100% 确定最后一行是我真正的问题所在。

标签: c system-calls


【解决方案1】:

正如您在此处给出的,curCharchar,但您将其传递给 read(2),就好像它是 char*。由于您没有提到获得 SIGSEGV,我确定这不是您的实际代码...

【讨论】:

  • 这是评论,不是答案。
  • 它确实解决了实际问题:“curChar 不包含下一个字节,它包含一个空字符 (...)。这是为什么?”。我添加第二句话只是为了解释解释和代码是错误的。
  • 在我见过的每个示例中,如果您只读取一个字节,则不必读取 char*。将 curChar 更改为 char* 并为其调用一个字节并不能解决我的问题。
  • 你误读了你的例子:他们说类似char c; read(fd,&amp;c,1);&amp;使成为char*
  • 好吧,看来你是绝对正确的,我很尴尬我没有意识到这一点。我对 C 编程非常陌生,所以谢谢你没有责备我哈哈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 2019-01-17
相关资源
最近更新 更多