【发布时间】:2013-05-25 06:28:45
【问题描述】:
我的任务是创建一个随机访问/二进制列表,并允许程序使用 windows.h 库及其 HANDLE 函数从中删除目标记录(结构)。 我编写了以下代码以尝试截断文件,虽然在文件末尾删除某些内容似乎可行,但中间处理文件的部分似乎很麻烦,我很难过。
void erase_record(FILE *file, stct buffer, char *target)
{
HANDLE h;
int jump=0;
int mark;
stct s;
file = fopen("list.txt","rb+");
s.artist = (char*)malloc(20*(sizeof(char)));
s.name = (char*)malloc(20*(sizeof(char)));
while(1)
{
jump++;
fread(&buffer,sizeof(buffer),1,file);
if(!strcmp(target,buffer.name)) // did we find a match?
{
jump--;
fread(&buffer,sizeof(buffer),1,file); // then check one more time.
if(feof(file)) // is the match right before the eof?
{
fclose(file);
h=CreateFile(L"list.txt",GENERIC_WRITE | GENERIC_READ,0,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
SetFilePointer(h,(jump)*sizeof(buffer),NULL,FILE_BEGIN); // truncate from last
SetEndOfFile(h);
CloseHandle(h);
break;
}
else // is it in middle of the file?
{
mark = jump; // we mark the struct we wanted to delete
while(1)
{
s.shelf = buffer.shelf;
s.artist = buffer.artist;
s.name = buffer.name;
jump++;
fread(&buffer,sizeof(buffer),1,file); // find the end of the file first
if(feof(file))// when we DO find the end..
{
break;
}
}
fclose(file);
h=CreateFile(L"list.txt",GENERIC_WRITE | GENERIC_READ,0,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
SetFilePointer(h,(jump)*sizeof(buffer),NULL,FILE_BEGIN); //deleting it!
SetEndOfFile(h);
CloseHandle(h);
file = fopen("list.txt","rb+");
fseek(file,mark*sizeof(buffer),SEEK_SET); // we erase the marked struct
fwrite(&s,sizeof(s),1,file);
break;
}
}
}
}
谁能分享一下出了什么问题?
【问题讨论】:
-
很小的一点不能回答你的问题,但我注意到你投了
malloc()的回报。请参阅stackoverflow.com/questions/605845/…,了解为什么应该避免这样做:) -
谢谢,其实信息量很大
-
再次,不回答您的问题,但不是遍历所有记录来查找最后一条记录,您可以使用
fseek(file, sizeof(buffer), SEEK_END)然后ftell()来为您节省一个while 循环吗?所有读取/写入/搜索是否成功...如果您检查ferror(),您是否检测到任何错误?从检查来看,它似乎很好......我不知道为什么它不起作用。如果您能说出您看到的哪些错误或症状可能会更清楚地了解现场情况? -
这实际上是一个很好的建议。我可能对我尝试了各种不同的东西而忘记简化它的代码感到太沮丧。它似乎没有发出任何怪癖,所以我真的很困惑
-
失败的症状是什么?
标签: c struct replace binaryfiles truncate