c ++二进制文件添加记录,搜索和替换

时间:2015-01-03 10:21:18

标签: c

我正在使用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);
}

1 个答案:

答案 0 :(得分:0)

使用fread阅读书籍后,文件指针已指向下一本书,仅调用fwrite进行更新是不正确的。

在切换fseekfread之前,您无需使用fwrite

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

此外,您的文件应使用&#34;二进制模式打开#34; (flag b)因为否则在编写未初始化部分中可能包含\n个字符的二进制数据时会遇到问题。