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);
}

但问题是,每当我在输入上使用打印语句时,它都会产生 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') 然后,因为十六进制值是用大写字母格式化的,所以使用:

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

您只是没有在程序中指定换行符的存在。

此外,您执行“fscanf”两次,以便程序每两行跳过一行。

#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 回答