2010-07-23 86 views
0

我读与数据的多行这样一个文件:的fscanf多行[C++]

: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); 

这是工作很好,除非当我到第一行结束。我需要这个重复,直到我到达文件的末尾,但是当我把它放在一个循环中时,它会变成一团糟。
我可以强制立场到下一行的开始吗?
我知道我可以使用流和所有,但我正在处理这种方法。
感谢您的帮助

+0

你真的必须使用fscanf_s吗? – karlphillip 2010-07-23 21:01:17

+0

现在是。 – 2010-07-23 21:10:58

+0

为什么?这是C++。 – Puppy 2010-07-23 21:25:56

回答

2

我的建议是转储fscanf_s并使用fgetsstd::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

您的主题明确指出您正在使用C++,因此,如果可以的话,我建议您使用正确的STL流操纵器。

要逐行读取,可以使用ifstream::getline。但是,再一次,你不是逐行阅读文件,而是逐场阅读文件。所以,你应该尝试使用ifstream::read,它可以让你选择从流中读取的字节量。

UPDATE:

虽然做了网无关搜索,我发现了一个叫IOF库,它可以帮助你完成这个任务。 Check it out.