gpt4 book ai didi

c - fscanf 读取空格分隔的数据直到返回

转载 作者:太空宇宙 更新时间:2023-11-04 02:51:10 25 4
gpt4 key购买 nike

我试图从一个 txt 文件中读取数据。 txt 文件有多个条目,每个条目占据一个新行,每个条目都有可变长度的十六进制字节数据,由一些符号分隔(比如空格'')。示例 txt 文件如下所示

e4 e2 e2 e1 ff\n
f2 a2 22 34\n
ff ee dd\n

在循环中使用 scanf(fp,"%2x",buffer+offset) ,我试图将每个字节加载到字节缓冲区中,直到每一行结束,标记一个完整的记录。主要问题是检测换行符,因为 scanf 完全忽略它并跳到下一行。我的原始代码是

do{
counter=fscanf(datain,"%2x",buffer1+offset);
fprintf(stdout,"%#2x ",buffer1[offset]);
offset+=counter;
}while(!feof(datain));

最佳答案

完成此类工作的另一种通常更简单的方法是使用 fgets() 阅读整行或 getline()然后使用 sscanf() 处理行中的符号.在许多方面,这与当前方案相似,但您需要能够在字符串中取得进展,因此 %n 转换规范通常在这里很有用:

while (fgets(line, sizeof(line), datain) != 0)
{
int line_offset = 0;
int new_offset;
while (sscanf(line + line_offset, "%2x%n", &buffer1[offset], &new_offset) == 1)
{
printf("%#.2x ", buffer1[offset]);
offset++;
line_offset += new_offset;
}
}

%n 转换不计入 sscanf() 的返回值。

请注意,这避免了另一个 answer 中出现的一些其他问题.它不会在没有行可读时尝试处理数据,也不会在没有剩余行时尝试处理数据。

此外,一次读取一行的优点之一是,当您可以给出发生错误的整个上下文(行)而不是被该行的剩余部分卡住时,错误报告通常会更容易/更好在一些不确定数量的成功转换之后。如果一行中第六个字段有错误字符,可以显示前五个字段以及错误所在,非常简单。

关于c - fscanf 读取空格分隔的数据直到返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22049615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com