【问题标题】:Comparing current line to next one using fgets?使用 fgets 将当前行与下一行进行比较?
【发布时间】:2016-02-17 20:37:05
【问题描述】:

我正在尝试使用 fgets 访问下一行,以计算与下一行相似的行数,是否有获取 nextLine 变量?

int similar = 0;
char line[100];
char nextLine[100];
FILE *f = fopen(file, "r");
while (fgets(line, 100, f)) {
            if (strcmp(nextLine, line) == '0') {
                      similar++;
            }
}

【问题讨论】:

  • 您是否认为它与 previous 行的比较相同?
  • 除了宏或枚举常量之外,不要使用全大写的名称。

标签: c file-io fgets


【解决方案1】:

这是可能的 - 添加一个新的 var next_line。例如,

int similar = 0;
char line[100] = "";
char next_line[100] = "";

FILE *f = fopen(file, "r");
while (fgets(line, 100, f)) {
    if (strcmp(next_line, line) == 0) {
            similar++;
    }
    strcpy(next_line, line);
}

注意:

  • 您必须检查strcmp 和0,而不是'0'
  • 这仅适用于比较相邻行。

【讨论】:

  • 如果你的第一行是空的,你会得到一个误报。
  • 将指针交换到两行不是更快吗?
  • @EugeneSh。这种情况不是误报 - 你还记得fgets 添加换行符吗?
  • 那么如果文件只有一个换行符会发生什么?如果我正确解析它,它将计为 1..
  • 如果文件有一个新行 - while 循环只读取一次并将其分配给 line - 而 next_line 保持为空 - 所以 strcmp 检查返回非零, similar不增加
【解决方案2】:

将当前行与前一行进行比较或将当前行与定义的字符串进行比较:
前任。我的文本文件包含以下文本:

This is a line // (\n)
This is a line // (\n)
This is a line // without newline

char line_comp []  = "This is a line\n"; // For lines with newline
char line_comp2 [] = "This is a line";   // For lines without newline
char line[255];                          // Store the line

现在我们可以浏览文件并查看这些行是否与上述之一匹配:

int equal = 0;
while (fgets(line, 255, f) != NULL) {
    if (strcmp(line, line_comp) == 0 || strcmp(line, line_comp2) == 0)
        ++equal;
}

然后最后打印结果:printf("Lines equal: %d\n", equal);
记得检查文件是否打开正确,使用后记得关闭文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    相关资源
    最近更新 更多