【问题标题】:Searching a string in a binary file in C在C中搜索二进制文件中的字符串
【发布时间】:2021-06-02 23:10:38
【问题描述】:

在这段代码 sn-p 中,我试图在二进制文件中添加一个字符串。如果字符串已经存在,则返回错误,否则将其添加到 EOF。我创建了两个函数,void AddNewTeam(FILE* fp, char* newTeam) 和 int SearchTeam(FILE* fp, char* newTeam),如下所示,但这不起作用。每次我输入一个字符串时,它都会添加到 EOF,即使是在二进制文件中。 我认为问题出在 fread 函数上,我尝试打印 fread 返回的值,但它始终为 0。有人可以帮我理解这段代码有什么问题以及为什么它不起作用吗?

void AddNewTeam(FILE* fp, const char* newTeam){
    int found;

    if((fp = fopen("File.dat", "rb")) == NULL){
        fp = fopen("File.dat", "ab");
        fclose(fp);
    }
            
    printf("\tEnter New Team: ");
    scanf("%s", newTeam);
            
    found = SearchTeam(fp, newTeam);
            
    if(found == 0){
        if((fp = fopen("File.dat", "ab"))){
            fwrite(newTeam, sizeof(newTeam), 1, fp);
            printf("\tThe following team has been successfully loaded\n");
            fclose(fp);
        }
    }else if(found == 1){
        printf("\tThis team already exists\n");
        exit(EXIT_FAILURE);
    }
}

int SearchTeam(FILE* fp, const char* newTeam){
    char string[MAX][MAX_LENGTH];
    int counter, result, found = 0;
    if((fp = fopen("File.dat", "rb"))){
        fseek(fp, 0, SEEK_SET);
        for(counter = 0; !feof(fp); counter++){
            if(fread(string[counter], sizeof(string[counter]), 1, fp) == 1){
                result = strcmp(newTeam, string[counter]);
                if(result == 0){
                    found = 1; break;
                }else if(result != 0){
                    found = 0;
                }       
            }
        }
        fclose(fp);
        return found;
    }else if(fp == NULL){
        printf("\tError opening binary file\n");
        exit(EXIT_FAILURE);
    }
}

这是主函数和函数原型

int SearchTeam(FILE* fp, const char* newTeam);
void AddNewTeam(FILE* fp, const char* newTeam);

int main(void){
    FILE* fp;
    char newTeam[MAX_LENGTH];
    AddNewTeam(fp, newTeam);
    return 0;
}

【问题讨论】:

  • 为什么需要searchTeam 中的数组?您可以为每个fread() 使用相同的字符串。
  • for(counter = 0; !feof(fp); counter++){ 不要使用 feof()。绝不。 stackoverflow.com/questions/5431941/…
  • 考虑打开一个FILE* 并将其作为参数传递给任何需要它的函数。这样您就可以避免使用 硬编码文件名 来打开流 4 - 在两个函数中的不同时间。
  • const char* newTeam) .... scanf("%s", newTeam); 是个问题 - 写信给 const。发布AddNewTeam()调用代码。

标签: c string binaryfiles


【解决方案1】:

您没有正确附加到文件。搜索代码期望每个团队名称都位于MAX_LENGTH 字节块中。但是当你写作时,你会这样做:

fwrite(newTeam, sizeof(newTeam), 1, fp);

newTeam 是一个指针,而不是一个数组,所以sizeof 将是一个指针的大小,通常为 4 或 8 个字节。您需要写入 MAX_LENGTH 字节,以便与您从文件中读取的方式相匹配。

fwrite(newTeam, MAX_SIZE, 1, fp);

【讨论】:

  • 谢谢!那行得通!我已经在那个代码上苦苦挣扎了几个小时。在使用函数之前,我在main函数里面做了AddNewTeam和SearchTeam函数,代码可以工作,这是为什么呢?
  • 因为在主函数中newTeam 是一个数组,而不是一个指针。就像在searchTeam 中一样。
猜你喜欢
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 2021-04-15
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 2014-08-10
相关资源
最近更新 更多