【问题标题】:A prgram that prints the length of a line in C一个在C语言中打印一行长度的程序
【发布时间】:2017-07-05 15:57:18
【问题描述】:

这是程序:

#include <stdio.h>
#define BUF_LEN 200
#define LINE_NUMBER 3

int line_len(char* filename, int n)
{
    FILE* f;
    char buf[BUF_LEN];
    int j, i = 0;
    if ((f = fopen(filename, "r"))) 
    {
        for (j = 0; j < n; j++)
            fgets(buf, BUF_LEN, f);
        for (i = 0; buf[i]; i++) /* find end of buf */ ;
        fclose(f);
    }
    return i;
}

int main()
{
    printf("%d\n", line_len("test.txt", LINE_NUMBER));
    return 0;
}

据我了解,函数line_len接收文件名和我们感兴趣的行数。然后它以只读模式打开文件并迭代直到到达n行,通过每次迭代从文件f 中读取BUF_LEN-1 字符并将这些字符存储在buf 中。因此,当第一个 for 循环中断时,buf 将包含第一个 n 行的所有字符。

我不明白需要第二个循环。它什么时候终止? 这个功能是如何工作的?如果在第一个 for 循环的末尾 buf 将包含前 n 行的字符,那么这个函数怎么会返回行 n 的长度?

提前致谢!

【问题讨论】:

  • 你忘了写几行代码吗?
  • 代码确实有效,对吧?
  • 第一个for循环将第n行的每个字符添加到buf数组中。第二个for 循环计算 buf 数组 (i) 的长度并返回。
  • 在第二个循环中,buf 有 n-esime (LINE_NUMBER-esime) 行,这个循环将在 'i' 中计算它有多少个字符。请记住,每个字符串的结尾都在 \0 中。这是一种 0。所以,当 buf[i] 为 \0 时(你的字符串结束并且 'i' 已经有多少个字符),第二个循环停止。
  • @Tree fgets 是用buf 调用的,这里和&amp;buf[0] 一样,是数组buf第一个 元素的地址。因此,实质上,您告诉fgets 将读取的行从第一个位置开始存储到buf。这会导致覆盖数组中以前的数据。

标签: c function file line fclose


【解决方案1】:

我不明白需要第二个循环。什么时候结束?

第二个循环以buf[i] 作为其循环条件。只要buf[i] 为真,即非零,它将继续执行。因此,当它到达行尾的 nul 字符(由fgets() 添加)时,循环将终止。

这个函数是如何工作的?

简单地说,它读取n 行。每一行都被放入缓冲区覆盖前一行。在读取n 行后,它会从读取第 n 行开始计算缓冲区中的字符数。

不过,这是一段糟糕的代码。 fgets 调用没有错误检查,如果第 n 行包含超过 199 个字符,它将给出错误的答案。事实上,如果你考虑一行的长度来排除换行,它总是得到错误的答案。

如果文件的行数少于n,并且如果无法打开文件,它也会返回零。如果读取一行发生错误,则返回一个不确定的数字,如果超出文件末尾,则返回最后一行的长度

在这些情况下,错误结果会更好。

【讨论】:

  • @chux 很好。在文件末尾,缓冲区保持不变,并且在出现其他错误时是“不确定的”。我会修改答案。
  • 非常感谢!它覆盖它,这使事情变得更加清晰。不过只有两件事:1-我怎么知道每一行都覆盖了前一行,我的意思是我怎么知道该行没有附加到缓冲区? 2-如果第二个循环一遇到'\0'就终止,那么它不会在读取第n-1行的第一个字符串而不是读取整行之后终止吗?
  • @Tree fgets 将整行放入缓冲区(如果缓冲区足够大),包括终止 \n,然后在 \n 之后放置一个 \0
  • @Tree 它通常不包含末尾带有 nuls 的字符串流。它几乎总是由以\n 作为行分隔符的非 nul 字符流组成(在 Unix 上)。它实际上是一个大字符串。你可以把 nuls 放在一个文本文件中,但是如果你这样做了,很多 C 程序就会像上面的那样崩溃。
  • @Tree 文本文件通常不包含 C 字符串(直到包含 '\0 的字符序列)。相反,文本文件通常包含(字符序列直到包含'\n')。 fgets() 读取一个,包括'\n' 并附加一个'\0' 以使buf[] 成为一个字符串。实现问题包括:可变行数、'\n' 仅行、长行、文件末尾没有'\n' 的行、在文本文件中嵌入'\0'、行结尾变化和文件输入错误。欢迎使用文本文件处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2022-10-18
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 2020-03-24
相关资源
最近更新 更多