В таких случаях, когда вы будете пытаться анализировать одну и ту же строку много раз, лучше прочитать строку в память, а затем обработать данные в памяти, а не на диске.
char line[MAXLINE];
fgets(line, MAXLINE, iFile);
Тогда у вас есть то, что я называю "лестница sscanf", которая представляет собой серию предложений if
- else if
, каждая из которых пытается проанализировать line
по-разному.Условие будет проверять возвращаемое значение sscanf
, поскольку число успешно прочитанных объектов является возвращаемым значением.Поэтому мы используем это число для различения нескольких различных форматов:
if (sscanf(line, "%c%x", &instr, &address) == 2)
/* you have an instruction and an address */
else if (sscanf(line, "%x", &address) == 1)
/* you have an address only */
Поскольку в вашем случае это условие цикла, вам придется преобразовать его в собственную функцию:
int readAtLeastAddress(const char *const line, char *instr, unsigned long long *address)
{
return sscanf(line, "%c%x", instr, address) == 2 || sscanf(line, "%x", &address) == 1;
}
Тогда вы бы переписали цикл как таковой
while (readAtLeastAddress(line, &instr, &address)) {
printf("%c", instr);
}