【发布时间】: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