fscanf несколько строк [c ++] - PullRequest
0 голосов
/ 24 июля 2010

Я читаю в файле с несколькими строками данных, как это:

:100093000202C4C0E0E57FB40005D0E0020C03B463
:1000A3000105D0E0022803B40205D0E0027C03027C
:1000B30002E3C0E0E57FB40005D0E0020C0BB4011D

Я читаю значения в байтах и ​​сохраняю их в массиве.

    fscanf_s(in_file,"%c", &sc);  // start code
    fscanf_s(in_file,"%2X", &iByte_Count); // byte count
    fscanf_s(in_file,"%4X", &iAddr);    // 2 byte address 
    fscanf_s(in_file,"%2X", &iRec_Type);  // record type 

    for(int i=0; i<iByte_Count; i++)
    {
        fscanf_s(in_file,"%2X", &iData[i]);
        iArray[(iMaskedAddr/16)][iMaskedNumMove+3+i]=iData[i];
    }
    fscanf_s(in_file,"%2X", &iCkS);

Это прекрасно работает, за исключением случаев, когда я дохожу до конца первой строки. Мне нужно, чтобы это повторялось до тех пор, пока я не дошел до конца файла, но когда я помещал это в цикл, он вылетал.
Могу ли я форсировать позицию до начала следующей строки?
Я знаю, что могу использовать поток и все такое, но я имею дело с этим методом.
Спасибо за помощь

Ответы [ 2 ]

2 голосов
/ 24 июля 2010

Я предлагаю сбросить fscanf_s и использовать либо fgets, либо std::getline.

Тем не менее, ваша проблема связана с переводом строк, а следующий маркер начала записи - ':'.

Один из методов - использовать fscanf_s("%c") до тех пор, пока не будет прочитан символ ':' или не будет достигнут конец файла:

char start_of_record;
do
{
  fscanf_s(infile, "%c", &start_of_record);
} while (!feof(infile) && (start_of_record != ':'));
// Now process the header....

Данные, которые читает OP, имеют стандартный форматдля передачи двоичных данных, обычно для загрузки во Flash Memories и EPROM.

0 голосов
/ 24 июля 2010

В вашей теме ясно сказано, что вы используете C ++, поэтому, если позволите, я предлагаю вам использовать правильные потоковые манипуляторы STL.

Чтобы читать построчно, вы можете использовать ifstream :: getline .Но опять же, вы не читаете файл построчно, вы читаете его поле за полем.Итак, вы должны попробовать использовать ifstream :: read , который позволяет вам выбрать количество байтов для чтения из потока.

UPDATE:

Выполняя несвязанный поиск по сети, я узнал о библиотеке IOF, которая может помочь вам в этой задаче. Проверьте это.

...