可以fread()检测空字符吗?

时间:2014-09-17 16:16:41

标签: c

使用C,函数 fread 可以用来读取空终止字符串吗?

我必须读取一个以ip开头的文件作为4个无符号字符,后跟一个描述空终止字符串数的整数。之后,我需要在另一个ip列表开始之前读取字符串直到最后一个字符串。

非常感谢您的帮助

修改 我需要检测空字符并停止继续

4 个答案:

答案 0 :(得分:5)

fread不会停止以任何分隔符'\0'或其他方式阅读。它试图读取所请求的确切字节数,并且只有在遇到文件结束或读取错误时才会提前停止。

在符合POSIX 2008标准的系统上,getdelim功能提供了一种简单的方法,直到'\0'"。否则,您将遇到调用getc或类似的循环。

答案 1 :(得分:3)

我认为回答这个问题的最好方法是:"有点"。请fread()读取空终止字符串吗?当然,fread()只是将文件中的数据作为字节读取。但是,你不能要求它读取下一个以空字符结尾的字符串,因为它不知道或不关心字符串。

您需要在阅读后进行一些处理,以确定字符串的结束位置以及您阅读的内容。这可能是一个不错的策略 - 读取一些文件,检查您读取了多少字符串,并在需要时再次阅读。但是,这确实会使事情变得复杂,就像在你不想读的字符串之后有更多的数据一样。

更简单的方法是使用fgetc()循环,例如:

for (int n = 0; n < strings_to_read; n++) {
    int ch, i = 0;
    while ((ch = fgetc(fp)) != '\0' && ch != EOF) {
        str[n][i++] = ch;
    }
    str[n][i] = '\0';
}

减去一些额外的调整以确保正确分配内存,正确处理EOF等,这种方法可以让你很容易地读取字符串。

答案 2 :(得分:1)

FatalError's answer的启发,请在下面找到稍微更有效(在声明方面)的版本,同时处理可能由于阅读或损坏的文件(根据OP的规范)引入的错误:

for (size_t n = 0; n < strings_to_read; ++n) 
{
  int ch = EOF;

  do
  {
     size_t i = 0;

     ch = fgetc(fp);
     /* Error handling: */
     if (EOF == ch)
     {
       /* Getting EOF means end of file (unexpected, from the OP's specifications) or an error. */
       if (ferror(fp))
       {
         perror("fgetc() failed");
       }
       else
       {
         fprintf("Unexpected end of file.\n");
       }

        exit(EXIT_FAILURE);
     }

     str[n][i++] = ch;
  } while ('\0' != ch)
}

答案 3 :(得分:0)

是。 fread只会从文件中读取字节,包括空终止符,直到它到达文件末尾。

编辑:
至于在空终止符处停止,其他答案已经解决了你的编辑问题,所以我不会重新哈希它!