【问题标题】:How to read lines from a file based on a criteria on the lines's content?如何根据行内容的标准从文件中读取行?
【发布时间】:2026-01-17 17:35:01
【问题描述】:

我有一个文件 abc.txt 有 8000 行。文件结构是:

121220122563841210000000 999.999 999.999 999.999
121220122563841210000000 999.999 999.999 999.999
121220122563841210000000 999.999 999.999 999.999
121220122563841210000000 999.999 999.999 999.999
121220122563841210000000 999.999 999.999 999.999
121220122563841210000000 0.2563 0.25698 2.3658
121220122563841210000000 999.999 999.999 999.999
121220122563841210000000 999.999 999.999 999.999
121220122563841210000000 2.365 2.365894 0.15463
121220122563841210000000 999.999 999.999 999.999
121220122563841210000000 999.999 999.999 999.999
121220122563841220000000 4.2563 6.25698 25.3658

顺序继续。

我需要编写一个程序来读取不包含 999.999 的行。这就是我的做法。我与我读取的值进行了比较,但它给出了完整的文件作为输出。什么是正确的方法做吗?

#include <stdio.h>

int main()
{
    FILE *fp,&fp2;
    char aa[50];
    float a,b,c;

    fp=fopen("abc.txt","r");
    fp2=fopen("aa.txt","w");
    while(!feof(fp))
    {
        fscanf(fp,"%s %f %f %f",&aa,&a,&b,&c);
        if((a!=999.999)&&(b!=999.999)&&(c!=999.999))
            fprintf(fp2,"%s %f %f %f",&aa,&a,&b,&c);
    }
    fclose(fp);
    fclose(fp1);
}

当我尝试使用时

if((a=999.999)&&(b=999.999)&&(c=999.999))

它只给出包含 999.999 的行,但我想要不包含 999.999. 的行。请耐心等待,我是 C 的新手。

【问题讨论】:

  • 当然你最好使用grep 来做这个......
  • a=999.999 会将 999.999 分配给 a。
  • 有人请帮我写一个代码 sn-p
  • @vijaykrishna 检查我发布的代码 sn-p。希望对您有所帮助。

标签: c


【解决方案1】:

这是怎么做的:

#include<stdio.h>
#include<string.h> 
#include<stdlib.h>   

int main(void)
{
char str1[90];
FILE *fp=fopen("D:\\source.txt","r");
if(fp==NULL)
{
 printf("ERROR");
 exit(-1);
 }

while(fgets(str1,89,fp)!=NULL)
{
    if(strstr(str1,"999.999")==NULL)
    printf("%s",str1);
}
fclose(fp);

}

它是如何工作的:我已将您的数据存储在文件source.txt 中。然后我使用fgets() 从该文件逐行读取到字符串str。我确保它的大小对于每一行都足够大。我任意使用了 90。然后,一旦我开始使用循环从文件中读取行,我仅在 strstr() 验证 999.999 时打印它不是该行的一部分。然后当我到达文件末尾时循环退出。很简单。这是输出。

121220122563841210000000 0.2563 0.25698 2.3658
121220122563841210000000 2.365 2.365894 0.15463
121220122563841220000000 4.2563 6.25698 25.3658

【讨论】:

  • +1 for fgets() + strstr() 解决方案,我打算发布完全相同的内容。
  • @H2CO3 不要不好意思说你要发布我发布的内容。你是 * 上的梅赛德斯,我仍然是一辆牛车。
  • 声誉并不代表任何东西。 上周有一个人拥有 200k+ 的代表,但他如此无知地坚持认为我的正确答案是错误的,这很伤人。我什至不明白... On: 这是 the 正确的解决方案,这就是我投票的原因。祝你在 SO 上获得声誉!
  • @Thotkchom(您的答案需要改进的两点是 1. 格式化,2. fgets(str1, sizeof(str1), f); 更安全,如果您有兴趣 :))
【解决方案2】:

浮点比较可能无法正常工作。更多信息请参考这里Comparing floating point numbers in C

只需使用fgets() 阅读整行并使用strstr() 检查子字符串999.999。可以使用strtok() 分隔值。

现有代码中的一些问题:

  1. 打印时不要使用变量的地址。

    fprintf(fp2,"%s %f %f %f",**&aa,&a,&b,&c**);
    
  2. 虽然读取它不是强制使用 char 数组的地址。

     fscanf(fp,"%s %f %f %f",**&aa**,&a,&b,&c);
    

【讨论】:

  • Jeyram 提出的想法只是将整行读入缓冲区(类似于将行上的第一项读入变量'aa')。然后使用函数 strstr() 来验证是否有 '999.999'。谷歌“strstr”以获取更多详细信息和示例。