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

16 進数の整数を読み取るには、%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、入力に表示される可能性のある最大長です。

于 2013-10-03T00:58:31.007 に答える
-1

あなたが提案するほど頻繁にそれを行ったとは思いません:文字列を unsigned char に読み込んでいます-これは (C または C++ では) 適合しません。文字列を初期化されていないポインターに読み取っているようです-これは機能しません(CまたはC++で)。

于 2013-10-03T00:58:48.503 に答える