- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的目标是实现一个计算文件行数的函数。空文件被认为没有行。如果给定文件的最后一行不为空,尽管没有以换行符结尾,也应该算作一行。
我想出了以下代码:
int linecount(const char *filename)
{
FILE *f = fopen(filename, "r");
if(!f)
return -1;
int lines = 0;
int c = 0;
int n = 0;
while((c = fgetc(f)) != EOF){
if(c == '\n')
lines++;
n++;
}
if(n==0)
return 0; //return 0 if the file is empty
if(c!='\n' && !isspace(c))
lines++; //count the last line if it's not empty
fclose(f);
return lines;
}
然而,即使在玩了一个多小时之后,我也无法弄清楚为什么它的返回值线在某些情况下太大了......
最佳答案
你已经很接近了,这里是你如何做到的:
int linecount(const char *filename) {
FILE *f = fopen(filename, "r");
if (!f)
return -1;
int lines = 0;
int c = 0;
int n = 0;
int read_line = 0;
while ((c = fgetc(f)) != EOF) {
read_line = 1;
if (c == '\n') {
lines++;
read_line = 0;
}
n++;
}
if (n == 0)
return 0; //return 0 if the file is empty
if(read_line)
lines++;
fclose(f);
return lines;
}
我们想知道我们是否开始阅读一行,以及是否在该行的末尾遇到换行符。因此,我们使用另一个变量,称为 read_line
我们将其用作标志。
如果我们刚开始读取一行,我们将它设置为 1 (true),如果我们刚遇到一个换行符(行尾),我们将它设置为 0 (false)。
现在,如果我们有类似的东西:
1[newline]
2[newline]
3
我们会没事的,因为我们需要在读取文件后检查 read_line
。如果是这样,我们必须将行计数器加一。
这也行:
1[newline]
2[newline]
3[newline]
因为我们在读取文件后看到三个换行符并且 read_line
为 0。
同样适用于这种情况:
1[newline]
2[newline]
3[newline]
[nothing here]
因为我们的标志在读取文件后将等于 0,因为第 3 个换行符应该将其设置为 0 并且我们实际上从未进入循环中的第 4 行,因为没有任何内容可读。
对于您之前的实现,如评论中所述,这一行:
if(c!='\n' && !isspace(c))
将在 c
等于 EOF
的情况下执行。
或者您可以只使用 fgets()你完成了。检查示例:
#include <stdio.h>
#include <string.h>
#define bufSize 1024
int main(int argc, char *argv[])
{
FILE *fp;
char buf[bufSize];
if ((fp = fopen("test.txt", "rb")) == NULL)
{ /* Open source file. */
perror("fopen source-file");
return 1;
}
int lines = 0;
while (fgets(buf, sizeof(buf), fp) != NULL)
{ /* While we don't reach the end of source. */
/* Read characters from source file to fill buffer. */
/* fgets will stop when it finds a newline. */
lines++;
}
printf("lines = %d\n", lines);
fclose(fp);
return 0;
}
关于c - 行数之谜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29345628/
我一直在使用高精度时间在控制台中记录我的程序事件。但很快我就注意到程序有时会显示四舍五入到毫秒的时间,有时则不会!它完全偶尔发生,它是相同的代码,未重新编译,未在运行之间编辑: using Syste
首先:该代码被认为是纯粹的乐趣,请在生产中不要做任何类似的事情。在任何环境下编译并执行这段代码后,对于您,您的公司或您的驯鹿造成的任何伤害,我们概不负责。以下代码不安全,不可移植,并且非常危险。被警告
我正在投影图像,然后检查它: 高度是20px。这是正确的。 然后我检查包含 img 的 data-radium 元素,令我惊讶的是: 尽管没有内容,该元素的高度“增长”了两个像素。此外,data-ra
我是一名优秀的程序员,十分优秀!