C 二进制文件中动态大小的fread字符串

C 二进制文件中动态大小的fread字符串,c,binaryfiles,fread,C,Binaryfiles,Fread,我需要知道如何使用fread()从二进制文件中读取字符串 我的理解是,如果我想将某个字符串的值复制到一个声明如下的新字符串: char *string; newLength = strlen ( otherString ) + 1; string = malloc ( sizeof ( char ) * newLength ); if ( string == NULL ) { return ( FALSE ) } 我需要首先使用strlen()计算另一个字符串的长度,使用该值为ma

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

我的理解是,如果我想将某个字符串的值复制到一个声明如下的新字符串:

char *string;
newLength = strlen ( otherString ) + 1;
string = malloc ( sizeof ( char ) * newLength );
if  ( string == NULL ) {
    return ( FALSE )
}
我需要首先使用strlen()计算另一个字符串的长度,使用该值为malloc的新字符串保留内存,然后使用strcpy()将另一个字符串的值复制到我的新字符串

有点像这样:

char *string;
newLength = strlen ( otherString ) + 1;
string = malloc ( sizeof ( char ) * newLength );
if  ( string == NULL ) {
    return ( FALSE )
}
但是如果我从一个二进制文件中读取数据,并且我试图从这个文件中读取一个字符串,但是我事先不知道它的长度,因此我不能使用malloc为这个字符串保留内存,会发生什么呢

即使我还没有为字符串保留内存(我不太相信),这会起作用吗


我现在有点困了。希望你们能给我一些启示,给我一些指导。

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

你的问题内容复杂。您说的是“二进制”文件,但您想从中读取字符串数据。解析文件中的字符串通常意味着文件本质上是文本的。尽管如此,在不预先知道正在读取的字符串长度的情况下,您可以逐字节读取文件,计算字节数,直到到达字符串终止符,然后分配相应的缓冲区,倒带文件,并读入缓冲区

或者,您可以预先分配任意大的缓冲区,而不必担心未使用的数量。如果需要读取许多不同的数据量,则可以更节省,方法是预先分配内存,以最佳方式将其打包以读取每个字符串,如果耗尽缓冲区,则可能使用realloc()

fread()不执行面向字符串的读取,例如fscanf(),它将以null终止使用%s格式说明符扫描的字符串。fread()是数据不可知的,只需填充指定的缓冲区,如果文件结束,则不填充。如果“二进制”数据包含空终止符,也许这就是您想要使用的,但在我看来,值得重新思考

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

char string[1000];

从文件中读取字符串很棘手,因为许多用户将“文本行”(各种
char
后跟
'\n
')称为“字符串”。但是在C语言中,“字符串”是各种各样的
char
,后面跟着一个
'\0'

fgets()
scanf()
fread()
不具备从文件读取C字符串的能力。在
'\0'
之前,任何人都无法轻松阅读

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


阅读后,你想用这个字符串实现什么?有点复杂。任务是使用文件模拟简单链表的行为,其中每个文件模拟节点的行为。文件本身包含一个数据(可以是int、char等)和下一个包含数据的文件名。如果下一个文件名为“0.bin”,则表示我们已到达列表上的最后一个文件。因此,正如您所猜测的,字符串表示下一个包含数据的文件的名称。希望我解释得很好。注意,这假设字符串是文件中唯一剩下的东西。如果字符串后面有更多的数据,这种方法可能是不够的。我知道我可以分配更多实际要使用的内存,但我尽量避免这样做。我只想保留我想要使用的确切内存量。简短回答:你不能。长(er)回答:你仍然不能,但如果你需要更多(或更少)的空间,你可以从小处着手,进行多次读取并使用
realloc
重新分配。好吧,第二个选项听起来非常复杂,我甚至不知道如何使用realloc。我想我得照你说的去做。谢谢你的回答,这真的很有帮助。