我正在turbo c++ 3.5 中处理二进制文件,我想创建一个库程序。我想在二进制文件中添加有关书籍的信息并执行诸如:搜索和替换、删除记录等功能。
我执行此功能,但有 2 个问题: 1. 例如,当我将 6 条有关书籍的记录添加到文件时,BooksReport 函数无法显示所有记录,例如仅显示 4 或 5 条记录,而当我搜索记录时,从 5 条记录开始记录,例如我刚刚找到 3 或 2 条记录。 2.当我搜索并替换文件中的某个单词时,此编辑记录之前的所有记录都将被删除。
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void add();
void search();
struct {
char name[20];
char id[2];
char publisher[20];} books, listbooks[100];
void main(){
add();
// search();
getch();
}
//Add
void add(){
FILE *pt;
pt=fopen("books.dat","a");
clrscr();
printf("\t Please Enter Data for new book");
printf("\n Please enter Name:");
scanf("%s", &books.name );
printf("Please enter ID:");
scanf("%s", &books.id );
printf("Please enter Publisher:");
scanf("%s", &books.publisher);
fwrite(&books, sizeof(books), 1,pt);
fclose(pt);
}
void search(){
//Search and replace
pt=fopen("books.dat","w+");
char replaceName[20];
char searchName[20];
rewind(pt);
found=0;
printf("Please enter search word \n");
scanf("%s", &searchName);
printf("Please enter replace word \n");
scanf("%s", &replaceName);
i=0;
do{
i++;
fread(&books, sizeof(books), i,pt);
if(strcmp(searchName,books.name)==0){
found=1;
strcpy(books.name,replaceName);
fwrite(&books, sizeof(books), i,pt);
break;}
}while(!feof(pt));
clrscr();
if(found==1){
printf("Replace successful!");
}
if(found==0){
printf("Not Found");
}
fclose(pt);
}
最佳答案
使用 fread
阅读一本书后,文件指针已经指向下一本书,仅调用 fwrite
来更新它是不正确的。
在 fread
和 fwrite
之间切换之前,您无论如何都需要使用 fseek
。
要知道fseek
的位置,可以使用index * sizeof(books)
。
此外,您的文件应该使用“二进制模式”(标志 b
)打开,否则在写入可能包含 \n
字符的二进制数据时会遇到问题在未初始化的部分。
关于C++ 二进制文件添加记录、搜索和替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27753805/