从二进制文件的动态大小的FREAD串(fread string of dynamic size fr

2019-10-28 13:02发布

我需要知道如何从一个二进制文件使用的fread读取一个字符串()。

事情是,我明白,如果我想一些字符串的值复制到宣布这样一个新的字符串:

char *string;

我首先需要计算其他使用字符串的strlen(长度),使用该值保留内存为我的新字符串使用malloc,然后使用strcpy的 Ø另一个字符串值复制到我的新的字符串()

有点像这样:

newLength = strlen ( otherString ) + 1;
string = malloc ( sizeof ( char ) * newLength );
if  ( string == NULL ) {
    return ( FALSE )
}

但是,如果我从一个二进制文件中读取数据会发生什么,我试图从该文件中读取一个字符串,但我不知道事先的长度,所以我不能使用malloc保留内存用于表示字符串?

将这项工作,尽管我没有保留字符串内存,但(我不那么信服)?:

fread ( string, sizeof ( char ), strlen ( string ), currentFile );

我现在有点卡住。 希望你们可以摆脱我一些光,引导我一点。

Answer 1:

你的问题具有一定的混合内容。 你说的“二进制”文件,但你想从中读取字符串数据。 从文件中解析字符串通常意味着该文件在本质上是文本。 不过,不知道是先验的 ,你正在阅读的字符串的长度,就可以读取该文件逐字节,字节计数,直到你达到一个字符串结束,之后就分配一致的缓冲器,快退的文件,阅读到您的缓冲区。

或者,您可以预先分配一个任意大的缓冲区,而不用担心未使用的金额。 如果你需要阅读很多不同的数额,由你包裹出最佳读取每个字符串,可能使用realloc()的 ,如果你用尽缓冲区预分配的内存,你可以更节俭。

FREAD()不执行字符串面向读,在意义上,说的fscanf(),这将空-终止与%s格式扫描字符串。 的fread()是与数据无关的,并且简单地要么填充指定的缓冲区,或没有,如果文件结束-。 如果“二进制”的数据包含null终结,也许这就是你要使用的东西,但它是值得重新思考,在我看来。

如果你打算使用动态内存分配的字符串指针您的声明仅仅是合适的。 如果你想使用定义你的字符串分配存储空间,你必须将其定义为数组类型。

char string[1000];


Answer 2:

只要你保持跟踪你实际使用多少内存,应该有分配比你使用(在合理的限度内 - 您没有为8字节字符串分配64 KB)更多的内存没有问题。

fread返回读取的元素个数(可能小于要求的项目数),如果你正在读一个字符串,你应该添加一个0您分配的字符串,在这么多字节之后的字节:

// we'll read at most 255 bytes
// C strings always need one extra '\0' byte at the end, though
char *string = malloc(256);

// open file "test.txt"
FILE *fp = fopen("test.txt", "r");

// read text from file, and store the number of characters read in len
size_t len = fread(string, sizeof(char), 255, fp);
// note that you can't use strlen(string) here because string doesn't have any data
// so we just tell it to read "as many bytes it can, up to a maximum of 255"

// add '\0' byte to the end because all C strings require this,
// and fread() doesn't add this for us
string[len] = '\0'; // note that string[len] is the (len+1)th character


Answer 3:

为了从文件中读取一个字符串是棘手的,因为很多用户调用(各种“文本行” char后跟一个'\n ”)是‘串’。 但在C“串”是各种char后跟一个'\0'

fgets() scanf()fread()没有足够的资源,以从文件中读取C字符串。 无轻松拥有读,直至能力'\0'

假设你想读一个任意长的“C字符串”:建议使用fgetc()

char *ReadString(FILE *inf) {
  if (inf == NULL)
    return NULL;
  size_t size = 1;
  char *buf = malloc(size);
  if (buf == NULL) {
    return Handle_AllocFailure();
  }
  size_t i = 0;
  int ch;
  while ((ch = fgetc(inf)) != EOF  && ch != '\0') {
    if (i + 1 >= size) {
      size_t newsize = (size + 1) * 4 - 1;
      char *newbuf = realloc(buf, newsize);
      if (newbuf == NULL) {
        return Handle_AllocFailure();
      }
      buf = newbuf;
      size = newsize;
    }
    buf[i++] = ch;
  }
  buf[i++] = '\0';
  // If a final re-size is desired...
  char *newbuf = realloc(buf, i);
  if (newbuf == NULL) {
    return Handle_AllocFailure();
  }
  buf = newbuf;
  return buf;
}

FILE *inf;
...
char *buf = ReadString(inf);
...
free(buf);


文章来源: fread string of dynamic size from a binary file