1

fscanf がどのように機能するかを理解していないという強い印象を受けています。

私は次のようにフォーマットされたテキストファイルを持っています:

0x01
0x02
0x04
0x08
0x0F
0x1F
0x2F
0x4F

そして、私はそれらを読みたい:

inline void read_inputs_from_ip_if(){

    if(fscanf(ipf,"%x",&input)==EOF){
        printf("Terminated.");
        exit(0);
    }

    fscanf(ipf,"%x",&input);
}

しかし、問題は、入力で print ステートメントを使用するたびに 0 が返されることです。各行を連続して読み取り、終わりのない for ループでいくつかの決定ロジックを実行したいと考えています。問題は、入力をまったく読み取らないことです。

これがメイン ブロックです。

ipf = fopen("input.txt","r");
for (; ; )
{
    read_inputs_from_ip_if();
    printf("Input: %x \n", input);
    control_action();
    write_output_to_op_if();
}

先に述べたように、入力は 0 から変化することはありません。fscanf は、ループのために、ファイルの最後に到達するまで新しい行を読み取るという印象を受けました...今はよくわかりません。

4

2 に答える 2

2

使用する :

 fscanf(ipf,"%x\n",&input);

行末文字 ('\n') を省略したため、行単位で読み取る場合は、16 進値が大文字でフォーマットされているため、次を使用します。

  fscanf(ipf,"%X\n",&input);
于 2013-02-24T22:59:20.440 に答える
1

プログラムに改行の存在を指定しなかっただけです。

また、「fscanf」を 2 回実行すると、プログラムは 2 行ごとに 1 行スキップします。

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

int input;
FILE *ipf;

inline void read_inputs_from_ip_if(){
    if(fscanf(ipf,"%x\n",&input)==EOF){
        printf("Terminated\n");
        exit(0);
    }
}

int main() {
        ipf = fopen("fscanf-data", "r");
        for(;;)
        {
                read_inputs_from_ip_if();
                printf("Datum: 0x%02x\n", input);
        }
        fclose(ipf);
        return 0;
}

それでも、関数が外部変数に依存せず、それ自体で終了 (または出力を生成) せず、呼び出し側プログラムにシグナルを返す方がよいと思います。

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

inline int read_inputs_from_ip_if(FILE *ipf) {
    int input;
    if (EOF == fscanf(ipf,"%x\n",&input)) {
        return EOF;
    }
    return input;
}

int main() {
        int input;
        FILE *ipf;
        ipf = fopen("fscanf-data", "r");
        if (NULL == ipf) {
            fprintf(stderr, "File not found\n");
            return -1;
        }
        for(;;) {
                input = read_inputs_from_ip_if(ipf);
                if (EOF == input) {
                     // We just exit the loop.
                     break;
                }
                printf("Datum: 0x%02x\n", input);
        }
        printf("Terminated.\n");
        fclose(ipf);
        return 0;
}

いずれにせよ、出力は期待どおりです。

Datum: 0x01
Datum: 0x02
Datum: 0x04
Datum: 0x08
Datum: 0x0f
Datum: 0x1f
Datum: 0x2f
Datum: 0x4f
Terminated.
于 2013-02-24T23:10:06.110 に答える