我目前正在尝试用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)
答案 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 ++中)。