我正在使用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);
}
答案 0 :(得分:0)
使用fread
阅读书籍后,文件指针已指向下一本书,仅调用fwrite
进行更新是不正确的。
在切换fseek
和fread
之前,您无需使用fwrite
。
要知道fseek
可以使用index * sizeof(books)
的位置。
此外,您的文件应使用&#34;二进制模式打开#34; (flag b
)因为否则在编写未初始化部分中可能包含\n
个字符的二进制数据时会遇到问题。