【问题标题】:why is my search function for file handling(.txt file) not working?为什么我的文件处理(.txt 文件)搜索功能不起作用?
【发布时间】:2020-06-23 13:49:25
【问题描述】:

我想搜索我为该书添加的结构(并打印该书的其他详细信息),以查找用户在 .txt 文件中输入的特定 issueNumber。

当我运行代码时,它会在要求用户输入 (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;
}

【问题讨论】:

  • 请注意:不要使用gets。这是非常不安全的。不过,对于你的问题,你有没有打电话给searchBookByIssueNumber?请出示minimal reproducible example
  • 你知道fp = fopen("c1.txt", "w+");截断文件,不是吗?
  • 不,我认为它不会,它会覆盖,但这里我只是从 id 查找函数 @user:3545273 中的文件中读取
  • @user:733637 ,我的文件只有文本文件,为什么说不是.txt文件
  • 文件的非文本内容我错了。

标签: c io file-handling


【解决方案1】:

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 不是安全说明符,它容易受到缓冲区溢出的影响,请使用 "%24s" 表示 25 字符的容器。

应该是这样的:

while (fscanf(fp, "%24s %d %24s %d\n", data2.author, 
&data2.issueNumber, data2.title, &data2.issued) == 4) {/*...*/}

2.文件在打开时被鞭打,我用"r""r+"标志。


3.(这个没有更正,链接有如何替换它的信息)

gets() 是一个已弃用的函数,尽管一些编译器仍然有它,this is an extremely vulnerable function and you should not use it

【讨论】:

  • @user:6865932 ,我在您回答之前编辑了代码以更正这些内容,但结果仍然相同。
  • 会不会因为你打开文件的方式,w+会清空文件。
  • @user:6865932,当我使用搜索功能时,gets 不可用
  • @KARANGUPTA 我在答案wandbox.org/permlink/UEdNqPVX3kJ6iDVm 中添加了代码的更正版本,示例的输入为5566。
  • @anastaciu,除了将模式更改为 r+ 之外,您还做了哪些更改,我看到 !=EOF 也有效。,我的代码中的错误是什么?
猜你喜欢
  • 1970-01-01
  • 2022-01-01
  • 2022-11-28
  • 2021-06-29
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2022-01-26
  • 2013-05-25
相关资源
最近更新 更多