繁体   English   中英

无法将缓冲区的内容复制到字符串中:从C中的.bin文件读取

[英]Cannot copy contents of buffer into string: reading from .bin file in C

我有一个函数,可以从文件中读取一定数量的字节并将这些字节放入字符串中。 使用fread可以在缓冲区b中打印每个元素的内容,但是如果我尝试打印整个字符串(b),则不会打印任何内容。 这是在for循环的代码中完成的; 我打印b [i]的内容。 然后在for循环之后,我尝试打印b,然后将b的内容放入我创建的结构中,供其他地方使用。

为什么会这样?

void load_frame(struct Entry P[], int framenum){
char b[256];
FILE*fp;
char *temp = malloc(256);
fp = fopen("BACKING_STORE.bin", "rb");

printf("We opened the file\n");
fseek(fp, 256*framenum,SEEK_SET);

fread(b, sizeof(b), 1, fp);

fclose(fp);
int i;
printf("Looking at the contents of buffer: \n");

for(i = 0; i < 10; i ++){
    printf("%u\n", b[i]);   

}
//Print contents of whole buffer
printf("%s",b);
//b[10] = "\0";


//Put b into char* content part of structure Entry
P[framenum].content = b;
printf("Content is: %s\n", P[framenum].content);
P[framenum].frame=framenum;

}

您将间接返回指向本地数组b的指针。 当函数返回并且存储在P[framenum].content值不再有效时,它将超出范围。 它可以被其他功能覆盖,因为它不再是您要使用的内存。

另外,缓冲区是否以空字节开头? 它是否包含空字节? 这些将终止字符串。

除了泄漏内存外,目前还不清楚您正在使用temp做什么。 但是,您可以很好地利用它而不是使用b (但是您必须测试对malloc()调用是否成功)。 完成后,调用代码将必须释放P[framenum].content的内存。

您需要捕获并使用fread()返回的值。 您需要验证文件是否成功打开。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM