1

abc.txt8000 行のファイルがあります。ファイル構造は次のようになります。

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..Bear with me I am new to 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 に答える