为什么我的文件处理(.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) {/*...*/}
  • 当您读取 ints 时,您需要将要存储值的变量地址传递给 scanfdata2.issueNumber 需要 &data2.issueNumberdata2.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.