【发布时间】:2011-12-13 03:34:42
【问题描述】:
我想逐行读取文本文件,但我对白线不感兴趣。跳过空白行有什么好方法?我知道我可以读取一行,检查它是否为空白,如果是则释放它,依此类推,直到我到达一个好的行,但我想知道是否还有其他方法可以做到这一点。
【问题讨论】:
标签: c text-parsing
我想逐行读取文本文件,但我对白线不感兴趣。跳过空白行有什么好方法?我知道我可以读取一行,检查它是否为空白,如果是则释放它,依此类推,直到我到达一个好的行,但我想知道是否还有其他方法可以做到这一点。
【问题讨论】:
标签: c text-parsing
我认为你的方法已经足够好了。从技术上讲,您甚至应该检查它是否只有空格 :-) 请注意,如果您使用的是fscanf(在家庭作业问题中经常使用),则跳过白线是“包含在价格中” :-) 而且您不必打架针对“这条线比我的缓冲区大,我该怎么办?”
【讨论】:
一般概念很好......您逐行阅读并检查它是否具有非空白字符。检查它的一种相当最佳的方法是使用 strspn ...例如:
#include <stdio.h>
#include <string.h>
int is_blank_line(const char *line) {
const char accept[]=" \t\r\n"; /* white space characters (fgets stores \n) */
return (strspn(line, accept) == strlen(line));
}
int main(int argc, char *argv[]) {
char line[256]; /* assuming no line is longer than 256 bytes */
FILE *fp;
if ( argc < 2 ) {
fprintf(stderr, "Need a file name\n");
return -1;
}
fp = fopen(argv[1], "r");
if ( !fp ) {
perror(argv[1]);
return -1;
}
while (!feof(fp)) {
fgets(line, sizeof(line), fp);
if (is_blank_line(line)) {
continue;
}
printf("%s", line);
}
return 0;
}
【讨论】:
如果逐行读取,请使用“\n”的简单检查(即使您的真正操作系统换行符是 \r\n,编译器也会小心)。 如果使用 fread 读取整个文件,使用 strtok 或 strtok_r 使用 sep='\n' 分割行,空行会自动被截掉。
【讨论】: