gpt4 book ai didi

c - 读取文件后无法关闭文件 - C 编程

转载 作者:行者123 更新时间:2023-11-30 16:47:46 25 4
gpt4 key购买 nike

我编写了一个函数,它读取一个充满文本的文件,然后将所有行连接成一个字符串。它可以工作,但是 fclose() 指令在使用时会引发错误:

* `./main' 中的错误:双重释放或损坏(输出):0x00000000020fc330 *”,后跟回溯和内存映射。

对于只有一行的文件,它的效果也很差。

我能做什么?

代码:

char* readFile(char* fileName){
FILE* myFile = fopen(fileName, "r");
if (myFile != NULL) {
fseek(myFile, 0, SEEK_END);
long l = ftell(myFile);
fseek(myFile, 0, SEEK_SET);
char* content = (char*)malloc((size_t)l * sizeof(char));
if (content == NULL) return NULL;
char * chain = (char*)malloc((size_t)l * sizeof(char));
while(fscanf(myFile, "%s\n", chain) != EOF || fscanf(myFile, "%s\t", chain) != EOF || fscanf(myFile, "%s ", chain) != EOF){
strcat(content, chain);
}
free(chain);
fclose(myFile);
return content;
} else return NULL;

}

最佳答案

这里发生的情况很可能是您对 scanf() 和/或 strcat() 的调用正在写入超过分配的缓冲区(内容或链)的末尾并损坏堆。当 free() 尝试释放“链”时会注意到这种损坏,从而导致错误消息和崩溃。

为了避免写入超过缓冲区末尾,您需要确切地知道每个调用将写入缓冲区的字节数。使用 fscanf() 很难知道这一点,除非您可以保证文件中将包含什么内容(通常您不会),因此您可能需要使用 fread() 来代替,以便可以指定最大字节数读书。此外,在调用 strcat() 时,您需要确保第一个参数指向的缓冲区有足够的空间容纳其现有内容以及要添加到其现有内容末尾的字符串内容。如果您想确保避免覆盖,请考虑调用 strncat() (因为 strcat() 无法知道缓冲区有多大,它会很高兴地写入过短缓冲区的末尾 - 至少是 strncat () 将在您在第三个参数中指定的字节数之后停止写入)

关于c - 读取文件后无法关闭文件 - C 编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43215923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com