0

その行がその形式のファイルがあります。

39.546147  19.849505  Name  Last 

何行あるのかわかりません。私が望むのは、テキストを1行ずつ読み取り、これら4つの要素のそれぞれを個別の変数に単純に保持することです。(その場合、2 つの float と 2 つの文字列 -char[] です。)

これまでの私のコードは次のとおりです。

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

int main(int argc, char *argv[])
{
   FILE * file1;

file1 = fopen("args.txt","r");
float var0;
float var1;
char S1 [128];
char S2 [128];
int assignments;

if ( file1 != NULL ){
    char line [ 256 ];
    while ( fgets ( line, sizeof line, file1 ) != NULL ) //read a line
    {
        //printf("%s\n",line);
        assignments = fscanf( file1, "%f %f %s %s",&var0, &var1, &S1, &S2 );
            if( assignments < 4 ){
                fprintf( stderr, "Oops: only %d fields read\n", assignments );
            }
        printf("%f --- %f ---- %s ---- %s  \n",var0, var1,S1,S2);
    }
    fclose ( file1 );

}
else {
    perror ( "args.txt" ); /* why didn't the file open? */
}
return 0;
}

私が得た結果は、1つの要素のみを読み取ったということです。それについて私を助けてもらえますか?

args.txt の例

39.546147  19.849505  george  papad 

39.502277  19.923813  nick  perry 

39.475508  19.934671  john  derrick
4

2 に答える 2

1

交換

assignments = fscanf( file1, "%f %f %s %s",&var0, &var1, &S1, &S2 );

assignments = sscanf( line, "%f %f %s %s",&var0, &var1, &S1, &S2 );

更新: 以下のプログラムはここで動作します。

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

int main(int argc, char *argv[])
{
FILE * file1;

float var0;
float var1;
char S1 [128];
char S2 [128];
char line [ 256 ];
int assignments;

file1 = fopen("args.txt","r");

if ( file1 == NULL ){
        perror ( "args.txt" ); /* why didn't the file open? */
        return 1;
        }

    while ( fgets ( line, sizeof line, file1 ) != NULL ) //read a line
    {
        //printf("%s\n",line);
        assignments = sscanf( line, "%f %f %s %s",&var0, &var1, S1, S2 );
            if( assignments < 4 ){
                fprintf( stderr, "Oops: only %d fields read\n", assignments );
                continue; /* <<----- */
            }
        printf("%f --- %f ---- %s ---- %s  \n",var0, var1,S1,S2);
    }
    fclose ( file1 );

return 0;
}

OUTPUT (空行のある入力ファイル用)

39.546146 --- 19.849504 ---- george ---- papad  
Oops: only -1 fields read
39.546146 --- 19.849504 ---- george ---- papad  
39.502277 --- 19.923813 ---- nick ---- perry  
Oops: only -1 fields read
39.502277 --- 19.923813 ---- nick ---- perry  
39.475510 --- 19.934671 ---- john ---- derrick

これは予期されたものであり、oops-block に continue (または同等のもの) があるはずです。

イラストの続きを追加しました。

continue を使用したプログラムの出力:

39.546146 --- 19.849504 ---- george ---- papad  
Oops: only -1 fields read
39.502277 --- 19.923813 ---- nick ---- perry  
Oops: only -1 fields read
39.475510 --- 19.934671 ---- john ---- derrick
于 2012-05-23T16:49:10.597 に答える
1

fgets を使用してテキスト行を読み取り、それを破棄しています (fscanf を使用して再度読み取るため)。

while ループ ガードとして fgets を呼び出す代わりに、関数 feof の使用を検討してください。したがって、ループ ガードは次のようになります。

while(!feof(file1))
于 2012-05-23T16:39:49.057 に答える