1

我有一个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 的新手。

4

2 回答 2

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()到一个字符串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
于 2013-05-16T07:09:22.570 回答
4

浮点比较可能无法正常工作。有关更多信息,请参阅此处比较 C 中的浮点数

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

现有代码中的一些问题:

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

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

     fscanf(fp,"%s %f %f %f",**&aa**,&a,&b,&c);
    
于 2013-05-16T06:52:42.990 回答