fscanf无法正确读取文件〜以HEX格式读取字节的问题

时间:2013-10-03 00:53:54

标签: c file-io struct hex scanf

我目前正在尝试用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)

2 个答案:

答案 0 :(得分:6)

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

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是输入中可能出现的最大长度。

答案 1 :(得分:-1)

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