无法在C中读取十六进制输入

时间:2013-02-24 22:49:47

标签: c input scanf hex

我的印象非常强烈,我只是不明白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将读取一个新行,直到它到达文件末尾...现在我不太确定。

2 个答案:

答案 0 :(得分:2)

使用:

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

逐行读取,因为省略了结束行字符('\ n') 然后,因为hexa值用大写字母格式化 使用:

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

答案 1 :(得分: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.