C++ 二进制文件添加记录、搜索和替换

标签 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);
}

最佳答案

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

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

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

此外,您的文件应该使用“二进制模式”(标志 b)打开,否则在写入可能包含 \n 字符的二进制数据时会遇到问题在未初始化的部分。

关于C++ 二进制文件添加记录、搜索和替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27753805/

相关文章:

java - 将 OpenCv Mat 对象从 Java 传递到 C Native

创建一个字符串数组来保存长字符串中的分割标记?

c - 信号量和共享内存

c - 整理文件输出问题

c - c中使用十六进制地址获取值

使用结构体的 C 段错误

c - 如何从 ptr 获取结构页面信息并使用 kmalloc 或 vmalloc 固定内存?

iOS 应用程序由于无限 while 循环而无法渲染

c++ - 源文件未编译,即使在编译过程完成后

c - 在嵌入式C中,如何将 "Unsigned Char"形式的返回十六进制值转换为可用的 "Integer"类型