我必须将程序从UNIX迁移到Windows。该程序是关于从串口获取数据。在接收它的原始UNIX机器中,它读作:
char my_buffer_a[200];
memset(my_buffer_a, '\0', sizeof(my_buffer_a));
if (fgets(my_buffer_a, sizeof(my_buffer_a), file_p))
{
n = sscanf("%d\t%d\t...%d\n0x0A",
my_record.field1, my_record.field2, ...)
....
}
我知道fgets()会读取直到EOF或换行符。这意味着在my_buffer_a中,我希望最后的'\ n'。然而令我惊讶的是,还有 0x0A ! (这是否意味着 两个 换行符?)这里发生了什么?
我担心的另一件事是在Unix和Windows中定义换行符。它们在Unix和Windows中都不一样。我的意思是在转换后,当我sscanf
时,我必须sscanf("%d\t%d\t...%d\r\n
(或sscanf(%d\t%d\t...%d\r0x0D\n0x0A
同时保持那种奇怪的逻辑)?
答案 0 :(得分:3)
scanf格式字符串中的换行符并不专门在输入中查找换行符 - 它只是跳过空格(任何空格)。制表符相同。此外,大多数 scanf格式说明符(除%c
和%[
之外的所有内容)都会跳过空格。所以一般来说:
您永远不会在格式字符串中使用\t
,\r
或\n
(%[
中除外} {{ 1}}),因为它会让人迷惑。使用空格代替,这可以做同样的事情
你应该避免在格式字符串中使用冗余空格,因为它们没有任何东西,只会让人感到困惑。
因此,通过以上操作,您的]
电话会变为:
sscanf
清楚地说明这会读取两个数字,然后是三个句点,然后是另一个数字,最后是字符串sscanf("%d%d ...%d 0x0A",
(4个字符)。
就Windows与Unix而言,对于Windows,在行尾会有额外的回车符(0x0A
)字符。但这些只是空格,因此\r
将像任何其他空格一样被跳过。所以你可以忽略它们。
答案 1 :(得分:0)
没有什么是“继续”。请read the manual page,其中明确指出:
如果读取换行符,则将其存储到缓冲区中。
行号编码的差异无关紧要,毕竟它们都是空格,因此在很多情况下都会跳过sscanf()
。
答案 2 :(得分:0)
保存在Windows中的文件将在每个文件的末尾\ r \ n。 在linux中,文件末尾只有\ n。