3

次のようなテキスト ファイルがあります。

i 3755
i 3633
i 4435
i 1434

これを入力として読み取るにはどうすればよいですか。fscanf を使用してみましたが、「i」の後にランダムな文字が表示され続けます。

たとえば、出力は次のようになります

i% 3755

i5 3633

これが私が試してきたことです:

    int data = 0; 
char command; 
if(fptr==NULL)
    printf("File Cannot Be Read"); 

fscanf(fptr,"%c %d\n", &command, &data); 
printf("%c " , command);
printf("%d\n" , data);

fscanf(fptr,"%s %d\n", &command, &data); 
printf("%c " , command);
printf("%d\n" , data); 

fscanf(fptr,"%s %d\n", &command, &data); 
printf("%s " , command);
printf("%d\n" , data);

それらのどれも機能していないようです。事前にご協力いただきありがとうございます。

編集:同じ問題を抱えていた人のための作業コードを次に示します。

int data = 0; 
char command; 
fptr = fopen(argv[1], "r"); 

if(fptr==NULL)
    printf("File Cannot Be Read"); 

while(fscanf(fptr,"%c %d \n", &command, &data) == 2)
{

        if(command == 'i')
        {
            printf("insert found\n");
        }
            if(command == 'd')
        {
            printf("delete found\n");
        }

} 

}

4

5 に答える 5

4
fscanf(fptr,"%c %d", command, &data); 

次のようにする必要があります。

fscanf(fptr,"%c %d", &command, &data); 
getchar();  // consume the newline character that fscanf left.

次のように定義したとします。

char command;
int data;
于 2012-11-28T16:39:58.690 に答える
1

簡単にするために、ループ内で を使用して行を読み取り、 をfgets()使用strtok()して異なる「文字列」を取得し、解析方法に従ってキャストすることをお勧めします。しかし、マイクも正しいですfscanf(fptr, "%c %d\n", &command, &data)。読むために使用できます。&文字列を使用している場合、変数名の前の" " の使用は無視できます。ただし、文字、整数、または浮動小数点数の場合は、operator(" &")のアドレスを使用する必要があります。

于 2012-11-28T16:40:35.540 に答える
1

これは正しくなく、バッファ オーバーランが発生します。

fscanf(fptr,"%s %d", &command, &data);

ascommandには単一のスペースしかありませんcharfscanf()、フォーマット指定子を使用"%s"すると、次の空白まで読み取られてから、終端の null 文字が に書き込まれcommandます。a を使用しchar[]て読み取り、読み取る の数を制限しcharます。

このチェックではエラー メッセージが出力されるだけで、実際にファイル ポインタNULLの使用が妨げられるわけではないことに注意してください。NULL


各行が正しい形式であることを確認するには、 を使用fgets()して行を読み取ってから、 を使用sscanf()してフィールドを読み取ります。fscanf()を使用してファイルから直接読み取る場合、次の2行:

私
3755

一行と同じように扱われます:

私は3755

改行文字も空白であるためです。例:

if (fptr)
{
    char line[1024];
    while (fgets(line, 1024, fptr))
    {
        char command;
        int data;
        if (2 == sscanf(line, "%c %d", &command, &data))
        {
            /* Use 'command' and 'data'. */
        }
    }
}
于 2012-11-28T16:45:12.443 に答える
1

この行で:

fscanf(fptr,"%c %d", command, &data); 

コマンドへのポインタを指定する必要があります。このような :

fscanf(fptr,"%c %d", &command, &data); 

読み取りカーソルが既にファイルの最後にあるため、次の行は機能しません。

于 2012-11-28T16:45:46.710 に答える
0

関数でfscanfは、フォーマットの最後にスペースを追加して、行に戻ることを期待する必要があります。このような

fscanf(fptr,"%c %d ", &command, &data);

スペース文字は、改行、集計、およびスペースへの改行を置き換えます

ところで、あなた%sは char の読み取りに使用しているようです&commandが、これは正しくありません

fscanf(fptr,"%s %d\n", &command, &data); 

代わりにこれを使用する必要があります

fscanf(fptr,"%c %d ", &command, &data); 
于 2012-11-28T17:05:51.277 に答える