我需要知道如何使用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 );

我有点卡住了。 希望你们能给我一些启发并引导我一点。

===============>>#1 票数:1

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

另外,您可以预分配任意大的缓冲区,而不必担心未使用的数量。 如果您需要读取许多不同的量,则可以通过节余分配内存来节省更多,这是通过预先分配内存来优化地读取每个字符串,如果耗尽缓冲区则可以使用realloc()

fread()不会进行面向字符串的读取,例如说fscanf() ,它将以%s格式说明符对以字符串结尾的字符串进行空终止。 fread()与数据无关,仅填充指定的缓冲区,如果文件末尾则不填充。 如果“二进制”数据包含空终止符,也许这就是您要使用的终止符,但我认为值得重新考虑。

仅当您打算将字符串指针用于动态内存分配时,声明才是适当的。 如果要使用定义为字符串分配存储,则必须将其定义为数组类型。

char string[1000];

===============>>#2 票数:0

只要您跟踪实际使用了多少内存,分配的内存就不会比使用的内存多(在合理的限制内–您不会为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

===============>>#3 票数:0

从文件中读取字符串是棘手的,因为许多用户将“文本行”(各种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);

  ask by ShadowGeist translate from so

未解决问题?本站智能推荐:

1回复

如何检查字符串是否在二进制文件中

我正在制作一个程序,该程序获取两个二进制文件,并检查第二个文件(字符串)是否在第一个文件中。 我尝试使用strstr函数,但是它不起作用。 这是我的代码的一部分:我正在读取文件吗?
1回复

在C中读取二进制文件的结果很奇怪

我正在研究64位Xubuntu 14.04。 我有一个相当大的C程序,并且要测试新功能,我通常在一个单独的程序中实现它们,以便在将它们合并到主程序中之前消除所有错误和其他错误。 我有一个函数,将const char *作为参数,以指示文件的路径(在这种情况下为/dev/rx.bin)
2回复

可能无法从c中的二进制文件写入或读取

如果您需要进一步的信息,请告诉我,以便我可以更新该信息。 我保存到文件的是以下结构的字段。 因为文件在开始时没有注册,所以我必须通过将标志设置为0来对其进行初始化。 我在/从中打开一个文件,我可以使用 用户给出文件中可以保存的最大注册数量 后来我在函数中发送指针fp
1回复

从二进制文件C编程读取

我需要读取包含3d点坐标的二进制文件,但首先有5条线以正常模式写入文件,因此首先我需要跳过该部分并读取点。 我尝试了fread但失败了。 我究竟做错了什么
1回复

二进制文件读取-写入不起作用

我一直试图在程序中编写一个包含一些信息的二进制文件,但是我无法使其正常工作。 我编写并尝试阅读它是否有效。 这是我要在文件内部编写的结构: 我有一个名为Jugador类型的player的变量。 在该函数中,我使用二进制文件,将player作为指针接收(因此Jugador *play
2回复

从二进制文件读取到int

我对二进制文件以及如何从它们中读取有点困惑,所以如果有人可以提供帮助那就太棒了。 我有一个包含以下位的文件: 00000000000000000000000000000111 (32位。我算了) 现在我写了这段代码: int main() { FILE * f1;
2回复

从.dat二进制文件读取数据

我有一个.dat文件需要读取,并为具有指定为命令行参数的属性的人打印记录。 文件的格式如下。 每个人的记录都以一个无符号的32位整数开头,该整数包含有关该人的各种信息: 位 0-4:名字的长度(键=名字) 5-9:中间名的长度(键=中间) 10-14:姓氏长度(键=姓
1回复

读取二进制文件,保存在缓冲区中,打印出缓冲区的内容

在我继续我的程序之前,我有一个需要解决的大问题。 我必须打开一个二进制文件,读取它的内容,将内容保存到缓冲区,使用malloc在堆上分配空间,关闭文件,最后是printf(.bin文件的内容)。 我到目前为止(关闭文件尚未实现): 我想我弄乱了缓冲区,我不确定我是否正确读取.bi
3回复

从二进制文件读取记录时,fread返回<1

我正在尝试从二进制文件中读取学生记录(SREC)。 该文件肯定包含完整记录(上一次运行会写入该文件)。 在我的输出中,对于两个记录,我两次收到“错误:无法从文件读取记录”语句。 顶部的printf(Reading record,numR)显示3次,所以我知道while循环应该到达eof时才
1回复

从二进制文件读取简单结构并在C中的屏幕上显示特定数据

我是编程的新手,正在编写我的第一个项目。 我的项目的一部分要求向用户询问日期,月份和年份; 将注释写入文件中,然后在屏幕上显示月份和年份的相应注释。 这是我的注释结构: 这是与输入有关的部分: 最后是负责根据给定的月份和年份读取和显示数据的部分: 一旦运行程序,输出