我正在读取一个文件,如:
31 0A 34 0A 31 0A 38 0A 34 0 a 33 0A 360A 31 0A 31 0 a 39 0A 31 30 0 a 31 30 0A35 0A 35 0A 31 30 0A 31 0A 33 0A 36 0A33 0A 31 30 0A 35 0A 31 0A 31 30a 390A 35 0A 38 0A 33 0A 36 0A 34 0A 33 0 a36 0A 35 0A 31 30 0A 37 0A 32 0A 36 0A33 0A 36 0A 35 0A 31 30 0A 37 0A 39 0A33 0A 36 0A 32 0A 36 0A 35 0A 340A0A30 20 31 20 34 37 32 37 0A 30 2033 20 36 33 36 33 0A 30 20 34 20 33 3635 37 0 a 30 20 35 20 33 33 30 0 a 3020 36 20 32 34 31 34 0A 30
我正计划阅读带有以下代码的文件的第一部分,直到找到序列0A 0A:
readed = fscanf(f,"%s", str_aux);
0A之后,我需要阅读以下句子:
readed = fscanf(f,"%s %s %s", str_aux1, str_aux3, str_aux3);
如何检测0A 0A以便开始读取文件的第二部分。
我想使用以下结构:
while (something){
readed = fscanf(f,"%s", str_aux);
}
while (fscanf(f, "%s %s %s", a,b,c)!= EOF){
...
...
}
对某些情况有什么想法(在第一段时间内)?
我正在研究Linux。
我可能使用fgetc和状态引擎。类似于:
int state=0;
char d;
while ((d = fgetc(f)) >= 0) {
if (d==0x0a)
state++;
else
state = 0;
if (state == 2)
do_something();
}
不过,我可能会使用fgets。类似于:
int state=0;
char line[MAXLINE];
while (fgets(line,sizeof(line),f))
if (state == 0 && *line == 0x0a)
state=1;
else if (state == 1)
{
sscanf(line,"%s %s %s",a,b,c);
do_something_else();
}
}
一般来说,我对调用fscanf()非常谨慎。我一直觉得fscanf解析器非常脆弱。我更可能通过fgets或其他方式获取行,然后解析结果。
如果您坚持使用fscanf,您可以一次读取一个字符。例如,
int nl_count = 0;
char current;
while(nl_count < 2)
{
readed = fscanf(f,"%c",¤t);
/* check that readed == 1, throw error otherwise */
if(current == 0x0A)
nl_count++;
else
nl_count = 0;
}
我认为这将完全符合你的意愿。这会一次读取一个字符,直到出现两个连续的0x0A(换行符)。然后循环中断,您可以继续进行第二个while循环。
不过,我同意赛斯的观点,fgets或fgetc更适合第一个循环。
当你查看问题的来源时,大多数行上都有13个十六进制数字,这是一个不寻常的数字。因此,我们可以简单地假设输入是一个以空格分隔的十六进制数字序列。
因此,在我(对于一些评论员)看来,使用gethex()
函数读取下一个信息是合乎逻辑的。
int gethex(void)
{
int x;
if (scanf("%2x", &x) != 1)
x = -1;
return x;
}
这可以用来读取字符:
int oc = 0;
int c;
while ((c = gethex()) != -1)
{
if (oc != 0x0A || c != 0x0A)
{
oc = c;
continue;
}
/* Read to 0x0A in a row - proceed as required */
int a, b, c;
if ((a = gethex()) == -1 ||
(b = gethex()) == -1 ||
(c = gethex()) == -1)
...error - unexpected EOF (or other format error)...
... Process a, b, c ...
}
请注意,如果数据中存在错误(十六进制或空白以外的字符),则按设计会停止此操作。