【问题标题】:how to print a section of each line of a file in c如何在c中打印文件每一行的一部分
【发布时间】:2021-03-10 10:43:23
【问题描述】:

我有一个文本文件,每一行都有这样的布局:

66.249.66.146 - - [31/Jul/2011:12:06:57 +0100] "GET /issue-download/page/4/ HTTP/1.1" 200 3768 "-"

地点:

IP address - - <some extra stuff>

我正在尝试仅使用以下方式打印 IP 地址:

while (fgets(singleLine, 14, file) != NULL) {
    if (strncmp(singleLine, "66.249.66", 9) == 0) {
        printf("%s\n", singleLine);
    }
}

当然,每行的前 13 个字符并不总是 IP 地址,如果 IP 地址类似于 66.249.66.5,它将打印为 66.249.66.5 -

我尝试了一个 fscanf 方法,所以:

char ip[14];
char extra[100];

fscanf(file, "%s - - %s", &ip, &extra);

while (fgets(singleLine, 14, file) != NULL) {
    if (strncmp(singleLine, "66.249.66", 9) == 0) {
        printf("%s\n", ip);
    }
}

以及%d.%d.%d.%d 用 fscanf 来表示 IP,但这也不起作用。有人有什么想法吗?

【问题讨论】:

  • @user3121023 他们一开始都有一个IP地址
  • @user3121023 是的,它总是以数字开头
  • 您的 fscanf 代码显示了对计算机工作方式的根本误解。您是否知道计算机按照代码告诉它们的顺序一次做一件事?

标签: c file file-io scanf


【解决方案1】:

你可以在阅读每一行之后这样做:

  1. 通过strstr()搜索分隔符。
  2. 计算数据开头和找到的分隔符之间的元素数。
  3. 使用数字指定要打印的字符数。
#include <stdio.h>
#include <string.h>

int main(void) {
    char data[] = "66.249.66.146 - - [31/Jul/2011:12:06:57 +0100] \"GET /issue-download/page/4/ HTTP/1.1\" 200 3768 \"-\"";
    char* separator;
    int length;
    separator = strstr(data, " - - ");
    if (separator != NULL) {
        length = separator - data;
        printf("%.*s\n", length, data);
    } else {
        puts("(invalid format)");
    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2015-03-06
    相关资源
    最近更新 更多