我正在开发一个程序,用于在文件中写入文件时搜索结构中的特定字符串。如果我在该文件中找到匹配项,我需要覆盖该结构的一部分。在文件中搜索匹配非常简单,但我正在努力覆盖该结构。下面是我搜索文件的代码,尝试覆盖该数据。
dfp = fopen(archName, "ab");
if(dfp == NULL) {
printf("An error has occurred... %s could not be opened.\n", archName);
return 0;
} /* End if */
/* Read first header file */
fread(&getHeader, sizeof(getHeader), 1, dfp);
/* Check for match */
if(strcmp(fName[0], getHeader.file_name) == 0) {
getHeader.deleted = (char)49;
fwrite(&getHeader, sizeof(getHeader), 1, dfp);
请注意,getHeader是一个结构。有多个结构可以存储在我的文件中的任何位置。我需要搜索每个标头的特定字符串(简单)。找到匹配项后,必须覆盖该结构。
建议采用什么样的流程来完成这项任务?
答案 0 :(得分:6)
您可以编写循环以将记录一次一个地读取到记录结构中。每次读取后,您可以将刚读取的记录与所需记录进行比较,如果不是您需要的记录,则读取下一条记录。
你刚刚找到了你想要的唱片,但你也只是阅读了记录;你必须寻求覆盖记录。您还必须每次都在读取和写入之间寻找,反之亦然,因为C标准表示如果不这样做,行为是不确定的。这意味着在写入之前进行搜索,在返回下一条记录之前进行另一次搜索。
由于您已在"ab"
模式下打开文件,因此任何搜索都无关紧要,因为所有写入都将在末尾附加。您可能希望将"r+b"
作为fopen()
的模式。
有关相同的一般问题的最新讨论,请参阅fseek()
goes back to the end of file when writing a value。