0

我目前正在尝试做一些我在 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)
4

2 回答 2

6

要读取十六进制整数%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输入中可能出现的最大长度在哪里。

于 2013-10-03T00:58:31.007 回答
-1

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

于 2013-10-03T00:58:48.503 回答