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 来更新它是不正确的。

freadfwrite 之间切换之前,您无论如何都需要使用 fseek

要知道 fseek 的位置可以使用 index * sizeof(books).

您的文件也应该使用 "binary mode"(标记 b)打开,否则在写入未初始化部分可能包含 \n 字符的二进制数据时会遇到问题.