Ширина как переменная при использовании 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?


person Nick Sinas    schedule 22.07.2010    source источник
comment
Вам нужно пояснить, о чем вы спрашиваете.   -  person Amardeep AC9MF    schedule 23.07.2010
comment
в основном я просто хочу иметь возможность устанавливать ширину с помощью переменной, которую я могу изменять для каждой строки, которую я читаю, вместо% 5X - здесь я ограничен шириной 5, я просто хочу поместить туда свою собственную переменную, чтобы мой ширина может быть динамической.   -  person Nick Sinas    schedule 23.07.2010


Ответы (5)


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

char format[8];
sprintf(format, "%%%dX", width);
fscanf(in_file, format, &iData);
person Chris Dodd    schedule 22.07.2010
comment
У вас есть файл in +, он должен быть in_file. - person SCFrench; 23.07.2010

Если вы действительно хотите иметь возможность программно настраивать формат 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...
person Rose Perrone    schedule 27.11.2011

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

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

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

person SCFrench    schedule 22.07.2010
comment
Да, все верно, я действительно сделал ошибку, в конце стоит контрольная сумма, которую я не хочу. Так что это не сработает для меня. - person Nick Sinas; 23.07.2010

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

person gnathan    schedule 22.07.2010

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

fread(buffer, nbytes, sizeof(char), in_file);
person ahy1    schedule 23.07.2010