为什么我的文件处理(.txt 文件)搜索功能不起作用?
why is my search function for file handling(.txt file) not working?
我想搜索我为特定问题的图书添加的结构(并打印图书的其他详细信息)用户在 .txt 文件中输入的编号。
当我 运行 代码时,它会在要求用户输入 (issueNumber-issuenumber) 后终止。
我不明白这背后的问题,我认为 while 循环(其中的代码)存在一些问题。
我也没有在 Internet 上找到任何关于文件处理的好资源(可能仅适用于文本模式)。如果有人推荐好的资源会很有帮助。
下面是我的代码,用于搜索 issueNumber 并打印其他详细信息。
我的结构:
struct data
{
char author[25];
int issueNumber;
char title[25];
int issued;
};
我的搜索功能:
void searchBookByIssueNumber(FILE *fp)
{
struct data data2;
data2.issued = 0;
int issuenumber = 0;
printf("enter issue no.");
scanf("%d", &issuenumber);
while (fscanf(fp, "%s %d %s %d\n", data2.author, &data2.issueNumber, data2.title, &data2.issued) != EOF)
{
if (data2.issueNumber == issuenumber)
{
fseek(fp, -5, SEEK_CUR);
printf("%s %d %s", data2.author, data2.issueNumber, data2.title);
}
}
fclose(fp);
}
启动函数:
void start(FILE *fp)
{
printf("---------------------------------------------------\n");
printf("| |\n");
printf("| WELCOME TO LIBRARY MANAGEMENT |\n");
printf("| |\n");
printf("---------------------------------------------------\n");
/*login();*/
/*addBook(fp);*/
searchBookByIssueNumber(fp);
}
主要功能:
int main()
{
FILE *fp;
fp = fopen("c1.txt", "w+");
start(fp);
return 0;
}
Here is a working version of your code(我没有修复 gets
但这绝对是你应该做的事情,更多信息在 3. 并且我删除了所有未使用的样本函数)
更正的问题是:
1.
while (fscanf(fp, "%s %d %s %d\n", data2.author,
&data2.issueNumber, data2.title, &data2.issued) != EOF) {/*...*/}
当您读取 int
s 时,您需要将要存储值的变量地址传递给 scanf
。 data2.issueNumber
需要 &data2.issueNumber
,data2.issued
需要 &data2.issued
。
我使用了 != EOF
条件,它在我的编译器中产生了一个无限循环(check it here),虽然这可能并不总是发生,但使用 == 4
条件是,IMO,更好的方法。
"%s
不是安全的说明符,它容易受到缓冲区溢出的影响,对 25 个字符的容器使用 "%24s"
。
总的来说应该是:
while (fscanf(fp, "%24s %d %24s %d\n", data2.author,
&data2.issueNumber, data2.title, &data2.issued) == 4) {/*...*/}
2. 当你打开文件时,文件正在被鞭打,我使用了 "r"
或 "r+"
标志。
3.(这个没有更正,link有关于如何替换它的信息)
gets()
是一个已弃用的函数,尽管一些编译器仍然有它,this is an extremely vulnerable function and you should not use it.
我想搜索我为特定问题的图书添加的结构(并打印图书的其他详细信息)用户在 .txt 文件中输入的编号。
当我 运行 代码时,它会在要求用户输入 (issueNumber-issuenumber) 后终止。
我不明白这背后的问题,我认为 while 循环(其中的代码)存在一些问题。
我也没有在 Internet 上找到任何关于文件处理的好资源(可能仅适用于文本模式)。如果有人推荐好的资源会很有帮助。
下面是我的代码,用于搜索 issueNumber 并打印其他详细信息。
我的结构:
struct data
{
char author[25];
int issueNumber;
char title[25];
int issued;
};
我的搜索功能:
void searchBookByIssueNumber(FILE *fp)
{
struct data data2;
data2.issued = 0;
int issuenumber = 0;
printf("enter issue no.");
scanf("%d", &issuenumber);
while (fscanf(fp, "%s %d %s %d\n", data2.author, &data2.issueNumber, data2.title, &data2.issued) != EOF)
{
if (data2.issueNumber == issuenumber)
{
fseek(fp, -5, SEEK_CUR);
printf("%s %d %s", data2.author, data2.issueNumber, data2.title);
}
}
fclose(fp);
}
启动函数:
void start(FILE *fp)
{
printf("---------------------------------------------------\n");
printf("| |\n");
printf("| WELCOME TO LIBRARY MANAGEMENT |\n");
printf("| |\n");
printf("---------------------------------------------------\n");
/*login();*/
/*addBook(fp);*/
searchBookByIssueNumber(fp);
}
主要功能:
int main()
{
FILE *fp;
fp = fopen("c1.txt", "w+");
start(fp);
return 0;
}
Here is a working version of your code(我没有修复 gets
但这绝对是你应该做的事情,更多信息在 3. 并且我删除了所有未使用的样本函数)
更正的问题是:
1.
while (fscanf(fp, "%s %d %s %d\n", data2.author,
&data2.issueNumber, data2.title, &data2.issued) != EOF) {/*...*/}
当您读取
int
s 时,您需要将要存储值的变量地址传递给scanf
。data2.issueNumber
需要&data2.issueNumber
,data2.issued
需要&data2.issued
。我使用了
!= EOF
条件,它在我的编译器中产生了一个无限循环(check it here),虽然这可能并不总是发生,但使用== 4
条件是,IMO,更好的方法。"%s
不是安全的说明符,它容易受到缓冲区溢出的影响,对 25 个字符的容器使用"%24s"
。
总的来说应该是:
while (fscanf(fp, "%24s %d %24s %d\n", data2.author,
&data2.issueNumber, data2.title, &data2.issued) == 4) {/*...*/}
2. 当你打开文件时,文件正在被鞭打,我使用了 "r"
或 "r+"
标志。
3.(这个没有更正,link有关于如何替换它的信息)
gets()
是一个已弃用的函数,尽管一些编译器仍然有它,this is an extremely vulnerable function and you should not use it.