【问题标题】:fscanf not reading the file correctly ~ problems with reading of bytes in HEX formatfscanf 没有正确读取文件 ~ 以 HEX 格式读取字节的问题
【发布时间】:2013-10-03 00:53:54
【问题描述】:

我目前正在尝试做一些我在 C++ 中做过几十次的事情,但这是我第一次在 C 中做。

我有一个包含 3 列的巨大文本文件:hexNumber unsignedChar int

adam  38      1
john  39      1
sara  3a      1
frank        3b      0
Christopher        3c      0
kate        3d      0

但是,就像我说的那样,文件很大,并且由于某种原因,它们之间的空格会有所不同。我不知道,我没有制作文件。我理解它的方式 fscanf 由空格分隔,所以任何数量都应该没问题,对吧?

我正在尝试将其读入结构数组,这是我的代码:

typedef struct node {
    unsigned char myHex;
    char* myString;
    int myInt;
} node;

void foo(bar* c){

    if( c == NULL )
        return;

    struct node nArr[205] ;

    //read in opcode information
    FILE *fp;
    fp = fopen( "input.txt" , "r" );

    if ( fp == NULL ) {
        fprintf( stderr, "Can't open input file file.txt!\n");
        exit(-1);
    }

    int it = 0;
    while( !feof( fp ) ){

        fscanf( fp , "%s%s%d\n" , nArr[it].myString ,
            &nArr[it].myHex , &nArr[it].myInt );
    }
...

但是,当我读到它时,我会被空白淹没。打印节目:

myHex: 
myInt: 0
myString: (null)

【问题讨论】:

  • 向我们展示一个完整的示例,并包含输入文件的头部。
  • unsigned char 列是否有最大长度?真的是unsigned char 还是简单的char

标签: c file-io struct hex scanf


【解决方案1】:

为了读取十六进制整数,应使用%x 格式说明符。另请注意,fscanf 的手册页中提到了 %x“指针必须是指向无符号整数的指针。” 因此您应该更改:

while( !feof( fp ) ){

    fscanf( fp , "%s%s%d\n" , nArr[it].myString ,
        &nArr[it].myHex , &nArr[it].myInt );
}

到:

unsigned int hexVal = 0;
for( ; fscanf(fp , "%s %2x %d\n",
                   nArr[it].myString,
                   &hexVal,
                   &nArr[it].myInt) == 3 ; ++it) {
    nArr[it].myHex = hexVal;
}

在您的struct 中,更改:

char* myString;

char myString[MAX_LEN];

其中MAX_LEN 是您的输入中可能出现的最大长度。

【讨论】:

  • 给出“样本”数据,即使这样也没有意义。我认为我们需要适当的样本数据...
  • 我会把实际数据放进去,对不起。
  • 鉴于 OP 问题中的新数据,那 %u 应该是 %x 吗?甚至 myHex 应该大于一个字符。也许是一个 int。
  • @CharlieBurns:是的,应该,我不再关注这个问题了 :) 但是这里可能是 %x 而不是 %2x :)
  • 除了错误“警告:格式 â%xâ 需要 âunsigned int *â 类型的参数,但参数 4 的类型为 âunsigned char *â [-Wformat]”之外,它仍然有效%s 很好
【解决方案2】:

我认为您没有像您建议的那样经常这样做:您正在将字符串读入无符号字符 - 这不适合(在 C 或 C++ 中)。您似乎正在将一个字符串读入一个未初始化的指针 - 这是行不通的(在 C 或 C++ 中)。

【讨论】:

  • 简单的错误是否意味着我在撒谎,或者只是我没有练习?我不欣赏语气或暗示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2014-04-06
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
相关资源
最近更新 更多