我需要知道如何从一个二进制文件使用的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 );
我现在有点卡住。 希望你们可以摆脱我一些光,引导我一点。
你的问题具有一定的混合内容。 你说的“二进制”文件,但你想从中读取字符串数据。 从文件中解析字符串通常意味着该文件在本质上是文本。 不过,不知道是先验的 ,你正在阅读的字符串的长度,就可以读取该文件逐字节,字节计数,直到你达到一个字符串结束,之后就分配一致的缓冲器,快退的文件,阅读到您的缓冲区。
或者,您可以预先分配一个任意大的缓冲区,而不用担心未使用的金额。 如果你需要阅读很多不同的数额,由你包裹出最佳读取每个字符串,可能使用realloc()的 ,如果你用尽缓冲区预分配的内存,你可以更节俭。
FREAD()不执行字符串面向读,在意义上,说的fscanf(),这将空-终止与%s格式扫描字符串。 的fread()是与数据无关的,并且简单地要么填充指定的缓冲区,或没有,如果文件结束-。 如果“二进制”的数据包含null终结,也许这就是你要使用的东西,但它是值得重新思考,在我看来。
如果你打算使用动态内存分配的字符串指针您的声明仅仅是合适的。 如果你想使用定义你的字符串分配存储空间,你必须将其定义为数组类型。
char string[1000];
只要你保持跟踪你实际使用多少内存,应该有分配比你使用(在合理的限度内 - 您没有为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
为了从文件中读取一个字符串是棘手的,因为很多用户调用(各种“文本行” 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);