【发布时间】:2017-09-09 03:17:02
【问题描述】:
我不小心在 for 循环中隐藏了一条额外的 printf 语句来运行昂贵的模拟,创建了大约 10 GB 的巨大文件,而不是大约 10 KB 的文件。
重新运行模拟并不是最好的选择,所以我决定尝试解决这个问题,即使我没有接受过任何正式的 C 培训。
我试图通过创建一个读取这些大文件的程序来解决这个问题,并且只打印出 (x, y, t, n) 形式的行,其中 (x, y, t, n 是 int , int, long double, long double)。其他行是基本描述某些参数的字符串、数字和空格的组合,但所有(数百万)不需要的行都以字母“i”开头。
所以我想我会尝试在此处遵循此代码的示例:Skip a line while reading a file in C
int main(int argc, char *argv[])
{
FILE *f;
if((f = fopen(argv[1], "r")) == NULL)
{
printf("Couldn't open file. \n");
return(0);
}
char buf[500];
while(fgets(buf, sizeof(buf), f) != NULL)
{
if(strcmp(&buf[0], "i") != 0)
{
printf("%s \n", buf);
}
}
}
看来是这样的
if(strcmp(&buf[0], "i") != 0)
并没有真正起作用,因为即使一行的第一个元素是“i”,该行的 printf 仍然会打印。有趣的是,如果我在 if 语句中添加这个:
printf("%c \n", buf[0]);
"i" 仍然可以打印,即使我试图将其作为 if 语句失败的条件。有趣的是,这条线
printf("%s \n", &buf[0]);
只打印与
相同的东西printf("%s \n", buf);
我试图重写
if(strcmp(&buf[0], "i") != 0)
作为
if(strcmp(buf[0], "i") != 0)
但刚刚收到错误消息。
如何正确地将每行的第一个元素与所选字符“i”进行比较?
【问题讨论】:
-
buf[0]是一个字符,您可以用if (buf[0] == 'i')...与另一个字符进行比较 -
哇,看来我只是在使用 " 而不是 ' ? facepalm 谢谢!
-
if(buf[0] != 'i') ... -
如果您使用的是 bash shell,并且只是想要一个解决方案,您可以使用类似:
sed '/^i/ d' giant_file.txt > filtered_file.txt。 -
也许 sed 或 awk 可以为您完成这项工作。我知道这不是编程答案,但您不必重新发明轮子。