c - 计算 ASCII 文件中换行符的最简单方法是什么?

标签 c

获取 ASCII 文件行的最快方法是什么?

最佳答案

通常您使用 fgets 在 C 中读取文件。您也可以使用 scanf("%[^\n]"),但是很多阅读代码的人可能会觉得这令人困惑和陌生。

编辑:另一方面,如果您真的只是想计算行数,稍微修改一下 scanf 方法就可以很好地工作:

while (EOF != (scanf("%*[^\n]"), scanf("%*c"))) 
    ++lines;

这样做的好处是,在每次转换中都有“*”,scanf 读取并匹配输入,但不对结果做任何处理。这意味着我们不必在大缓冲区上浪费内存来保存我们不关心的行的内容(并且仍然有机会获得比这更大的行,所以我们的计数最终是错误的除非我们需要更多工作来弄清楚我们读取的输入是否以换行符结尾)。

不幸的是,我们不得不像这样将scanf 分成两部分。 scanf 在转换失败时停止扫描,如果输入包含空行(两个连续的换行符),我们预计第一次转换会失败。然而,即使失败了,我们也希望进行第二次转换,以读取下一个换行符并移至下一行。因此,我们尝试首先转换以“吃掉”该行的内容,然后进行 %c 转换以读取换行符(我们真正关心的部分)。我们继续执行这两个操作,直到第二次调用 scanf 返回 EOF(通常在文件末尾,但也可能发生在类似读取的情况下错误)。

Edit2:当然,还有另一种可能性(至少可以说)更简单、更容易理解:

int ch;

while (EOF != (ch=getchar()))
    if (ch=='\n')
        ++lines;

有些人觉得违反直觉的唯一部分是 ch 必须 定义为 int,而不是 char 代码才能正常工作。

关于c - 计算 ASCII 文件中换行符的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4278845/

相关文章:

c - 使用其他函数释放 C 内存时遇到问题

c - 尝试删除节点会导致段错误

c - 另一个函数返回时主函数中的变量访问?

c - 如何在 C 源代码中包含内联汇编代码?

c++ - 在什么情况下应该使用匿名枚举?

c - OS X 上的 sem_init

c - 结构中的二维整数数组 - C

c - 传递参数 C -> NASM -> C

c - C中 "referencing"和 "dereferencing"的含义

c - 如果程序即将退出,释放分配的内存真的很重要吗?