【问题标题】:Having trouble reading Hexadecimal Input in C在 C 中读取十六进制输入时遇到问题
【发布时间】:2013-02-10 01:05:21
【问题描述】:

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

【问题讨论】:

  • 不要输入0x作为前缀然后尝试
  • @GrijeshChauhan 0x 前缀没有问题。
  • @ouah 好吧我也不确定

标签: c input scanf hex


【解决方案1】:

使用:

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

为了逐行阅读,因为你省略了结束行字符('\n') 然后,由于十六进制值是用大写字母格式化的 使用:

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

【讨论】:

  • 那行得通,但我不完全明白。我在哪个部分省略了换行符,究竟是什么?此外,由于某种原因,它会跳过所有其他输入行。我也不明白。
  • @Noc 当您从文件中读取时,行用结束符 ('\n') 分隔。当您的文本编辑器解释它时,它会转到一个新行,但文件的格式为 [line1]\n[line2]\n..[lineN]\n 您要求使用“%x\n”格式,因此每个跳过与此模式不匹配的其他输入。
  • 不,实际上原因是在函数内部,他调用了 fscanf 两次。所以他每次调用都读取两行,当函数返回时,只处理第二行。
  • @lserni 是的,我没有注意到,所以总是跳过第 n % 2 == 1 行。
  • 我建议完全避免使用scanf(),它令人困惑,甚至不太直观。不幸的巧合是,它是printf() 的对应“对”,因此初学者倾向于在更好的方法之前感知它:fgets()
【解决方案2】:

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

另外,您执行“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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-02
    • 2018-10-11
    • 1970-01-01
    • 2014-11-09
    • 2010-12-07
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    相关资源
    最近更新 更多