Подтвердить что ты не робот

Ширина как переменная при использовании fscanf

Я пытаюсь читать в определенной части файла, и количество данных различно для каждой строки, но я знаю, сколько байтов информации, которую я хочу. Вот так:

5bytes.byte1byte2byte3byte4byte5CKSum //where # of bytes varies for each line (and there is no period only there for readability)  

Фактические данные:

05AABBCCDDEE11
03AABBCC22
04AABBCCDD33

Итак, я хочу, чтобы моя ширина была такой переменной:

fscanf_s(in_file,"%variableX", &iData);  

Возможно ли это, потому что сейчас я думаю, что мне нужно создать оператор case?

4b9b3361

Ответ 1

К сожалению, нет, нет модификатора типа '*' для printf, который заставляет scanf получать свою ширину или точность поля от переменной. Ближе всего вы можете динамически создать строку формата:

char format[8];
sprintf(format, "%%%dX", width);
fscanf(in_file, format, &iData);

Ответ 2

Если вы действительно хотите программно настроить формат fscanf, вы можете попытаться выделить стек с строкой с достаточным пространством, а затем создать такой формат: например.

char formatString[100];

// writes "%max_size[0-9]", substituting max_size with the proper digits
sprintf(formatString, "%%%d[0-9]", MAX_SIZE); 

fscanf(fp, formatString, buffer); // etc...

Ответ 3

fscanf с% X автоматически остановится на новой строке, не так ли? Если поля действительно заканчиваются на новую строку (как в вашем примере), то вы не можете просто вызвать

fscanf(in_file, "%X", &iData);

и пусть fscanf выясняет, где находится конец?

Ответ 4

Вы также можете использовать С++-потоки.

#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() и множество других замечательных функций потока.

Ответ 5

Я думаю, что самым простым было бы использовать fread() следующим образом:

fread(buffer, nbytes, sizeof(char), in_file);