К сожалению, нет, нет такого модификатора, как '*' для printf, который заставляет scanf получать ширину поля или точность из переменной. Самое близкое, что вы можете сделать, это динамическое создание строки формата:
char format[8];
sprintf(format, "%%%dX", width);
fscanf(in_file, format, &iData);
fscanf с %X автоматически остановится на новой строке, верно? Если поля действительно заканчиваются новой строкой (как в вашем примере), то разве вы не можете просто вызвать
fscanf(in_file, "%X", &iData);
и позволить fscanf определить, где конец?
Вы также можете рассмотреть возможность использования потоков C++.
#include <ifstream>
#include <iostream>
// open the file and create a file input stream
ifstream file("test.txt" , ios::in | ios::binary);
// loop through the whole file
while (ifs.good())
{
// extract one byte as the field width
unsigned char width;
file.read(&width, 1);
// extract width number of unformatted bytes
char * bytes = new char[width];
file.read(bytes, width);
// process the bytes
...
delete [] bytes;
// skip EOL characters if needed
// file.seekg(1, ios_base::cur)
}
file.close();
Более простым способом, если новые строки включены, как вы, похоже, указываете, было бы использование getLine(). Посмотрите http://www.cplusplus.com/reference/iostream/ifstream/, чтобы узнать больше способов использования read(), get(), getLine() и многих других замечательных функций потоков.
Думаю, проще всего будет использовать fread() вот так:
fread(buffer, nbytes, sizeof(char), in_file);