如何根据行内容的标准从文件中读取行?

时间:2013-05-16 06:48:42

标签: c

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

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的新手。

2 个答案:

答案 0 :(得分:6)

以下是如何操作:

#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()逐行读取该文件到字符串{{1我确保它的大小对于每一行都足够大。我任意使用 90 。然后,一旦我开始使用循环从文件中读取行,我只在{{{ 1}}验证str不是该行的一部分。然后当我到达文件末尾时循环退出。很简单。这是输出。

strstr()

答案 1 :(得分:4)

浮点数比较可能无法正常工作。有关详细信息,请参阅此处Comparing floating point numbers in C

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

现有代码中的一些问题:

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

    fprintf(fp2,"%s %f %f %f",**&aa,&a,&b,&c**);
    
  2. 虽然读取非必须使用char数组的地址。

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