【问题标题】:scanning in specific word from a file扫描文件中的特定单词
【发布时间】:2022-11-18 01:47:30
【问题描述】:

我有一个名为 pageRankList 的文件,其中包含 url、传出链接的数量、按该顺序排列的页面排名。 如果我想获得给定 URL 的 pageRank。我怎么能用 fscanf 或其他功能做到这一点?

url23 4 0.0405449
url31 3 0.0371111
url22 5 0.0300785
url34 4 0.0288782
url21 2 0.0247087
url11 3 0.0235192
url32 2 0.0227647

这是我到目前为止所拥有的,但是当我运行它时,它在未知地址错误上给了我一个 SEGV,我不知道为什么 :(

static double getPageRank(char *url) {
    double pageRank = 0;
    FILE *fp = fopen("pageRankList.txt", "r");
    char str[1000];

    int counter = 0;
    while (fscanf(fp, " %98s", str) != EOF) {
        if (strcmp(url, str) == 0) {
            counter++;
            continue;
        }

        if (counter == 2) {
            pageRank = atof(str);
            printf("%f\n", pageRank);
            break;
        }
    }
    fclose(fp);
    return pageRank;
}

【问题讨论】:

  • 你尝试了什么调试?至少增加一些中间值的输出,不是吗?请发一个minimal reproducible example
  • 好吧,您没有检查文件是否已成功打开。将 NULL 传递给 fscanffclose 通常是导致崩溃的好方法。至于逻辑,我看不出计数器怎么会是 2,它只会匹配该行第一次读取的字符串。也不知道为什么 continue 在那里。您可能会考虑一次读取一行并使用 sscanf 解析该行,如果 url 匹配则返回排名。

标签: c file scanf


【解决方案1】:

while (fscanf(fp, " %98s", str) != EOF) {

这将在遇到空白时停止阅读。一次阅读所有三件事(url、外向链接数、页面排名)可能会更好。我会一次读一整行,然后在上面使用sscanf

static double getPageRank(const char* url)
{
    FILE* fp = fopen("pageRankList.txt", "r");
    if (!fp) return -1;

    char str[1000];
    double pageRank = -1;

    while (fgets(str, sizeof(str), fp)) { // Read line
        int number;
        char line_url[100];
        // Try to parse line
        if (sscanf(str, "%99s %d %lf", line_url, &number, &pageRank) == 3) {
            if (strcmp(url, line_url) == 0) {
                break;
            }
        }
    }
    fclose(fp);
    return pageRank;
}

*请注意,只要url 没有空格,这就有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    相关资源
    最近更新 更多