我正在编写一个大型应用程序,我最近在那里包含了用于处理文件的新模块。它具有编写整数和字符串的简单功能,在Red Hat上经过测试是完美的。它完全符合我的要求。
这里是函数的实现:
int CFile_open(CFile* owner, char* filename, char* mode) {
owner->file = fopen(filename, mode);
if (owner->file == NULL) {
return 0;
} else {
return 1;
}
}
int CFile_close(CFile* owner) {
if (owner->file == NULL) {
return 0;
} else {
if (fclose(owner->file) ) {
return 1;
} else {
return 0;
}
}
}
int CFile_writeInt(CFile* owner, int num) {
if (owner->file == NULL) {
return 0;
} else {
if (fwrite(&num, sizeof(int), 1, owner->file)) {
return 1;
} else {
return 0;
}
}
}
int CFile_writeString(CFile* owner, char* str) {
if (owner->file == NULL) {
return 0;
} else {
char b = strlen(str);
if (fwrite(&b, sizeof(char), 1, owner->file)) {
for (int i=0; i<=b; i++) {
fwrite(&str[i], sizeof(char), 1, owner->file);
}
} else {
return 0;
}
}
}
这些函数正在包装函数中使用,然后在我的应用程序中执行 这是函数:
void fileWrite(void* data) {
CList* list = (CList*)data;
CNode* node = list->first;
CData* info = NULL;
CFile* f = (CFile*)malloc(sizeof(CFile));
f->init = CFile_init;
f->init(f);
if (list->length == 0) {
printf("%s\n", "The list is empty!");
wait();
} else {
int i = 1;
if (f->open(f, (char*)"./f", (char*)"w")) {
while (node) {
info = node->getData(node);
if (f->writeInt(f, info->getNum(info))) {
if (f->writeString(f, info->getAdr(info))) {
if (f->writeString(f, info->getPh(info))) {
printf("%s%d\n", "Wrote item #", i);
i++;
} else {
printf("%s%d\n", "Error writing Phone of item #", i);
}
} else {
printf("%s%d\n", "Error writing Adress of item #", i);
}
} else {
printf("%s%d\n", "Error writing Number of item #", i);
}
node = node->next;
}
if (f->close(f)) {
printf("%s\n", "Wrote successfully");
wait();
}
}
free(f);
}
}
问题点是函数最后的f->close(f)
如果我不关闭文件,一切都完美无瑕。但如果我这样做,我会收到以下错误:
*** Error in 'a.out': free(): invalid next size (normal): 0x0859c320 ***
然而,尽管应用程序崩溃,但它确实关闭了文件,并且我写入的信息是正确的并且没有损坏。
但我无法弄清楚为什么我会收到错误。我只关闭文件一次(正如您在函数中看到的那样),我也尝试评论free(f)
行。
此外,如果我拨打fclose(f->file)
,我会收到同样的错误,因此这不是close()
功能问题。
我假设应用程序的其余部分工作(并且在我添加函数之前工作)完全除了我关闭文件的行。
我提到RedHat的原因是因为它在那里工作得很好,但是当我在ArchLinux(也尝试过Debian)下重新编译它时 - 它不会关闭文件。在任何地方都使用相同的编译器版本。
如果重要的话我用g++
编译它,但我对clang++
也有同样的问题。
我也试过用valgrind
运行它,它没有说文件,或者我找不到合适的密钥。也许你知道吗?
那么您对正在发生的事情以及如何解决这个问题有什么想法吗?我已经盯着代码了3个小时了,我无法理解我的生活。
测试用例:
info->getNum()
返回整数“11”(在输入期间分配)
info->getAdr()
返回动态分配的char数组“aa”(在输入期间分配和分配)
info->getPh()
返回动态分配的char数组“bb”(在输入期间分配和分配)
我可以使用我的应用程序中的其他功能测试这些值,因此我100%确信它们是正确的。
然后我只是唤起fileWrite()
函数。
答案 0 :(得分:2)
乍一看:
在CFile_writeString
中出现了一个错误的错误。 for (int i=0; i<=b; i++)
应在i<b
处终止。 &str[b]
将导致未定义的行为。
BTW,strlen
的结果类型为size_t
,而不是char
。
我不知道这是否是你问题的原因。