C++二进制文件添加记录、搜索和替换
c++ binary file add records, search and replace
我正在使用 Turbo C++ 3.5 处理二进制文件,我想创建一个库程序。我想在一个二进制文件中添加书籍的信息,实现查找替换、删除记录等功能
我执行此功能,但有 2 个问题:1. 例如,当我将 6 条关于书籍的记录添加到文件时,BooksReport 函数无法显示所有记录,例如仅显示 4 或 5 条记录,当我搜索记录时,从 5 条记录中,例如我刚找到 3 或 2 条记录。 2.When 我在文件中搜索并替换一个词,所有在该编辑记录之前的记录都将被删除。
#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)
.
您的文件也应该使用 "binary mode"(标记 b
)打开,否则在写入未初始化部分可能包含 \n
字符的二进制数据时会遇到问题.
我正在使用 Turbo C++ 3.5 处理二进制文件,我想创建一个库程序。我想在一个二进制文件中添加书籍的信息,实现查找替换、删除记录等功能
我执行此功能,但有 2 个问题:1. 例如,当我将 6 条关于书籍的记录添加到文件时,BooksReport 函数无法显示所有记录,例如仅显示 4 或 5 条记录,当我搜索记录时,从 5 条记录中,例如我刚找到 3 或 2 条记录。 2.When 我在文件中搜索并替换一个词,所有在该编辑记录之前的记录都将被删除。
#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)
.
您的文件也应该使用 "binary mode"(标记 b
)打开,否则在写入未初始化部分可能包含 \n
字符的二进制数据时会遇到问题.