[英]What does fgets() reads?
我必须将程序从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
同时保持这种奇怪的逻辑)?
scanf格式字符串中的换行符不会在输入中专门查找换行符,而是仅跳过空格(任何空格)。 制表符相同。 另外, 大多数 scanf格式说明符( %c
和%[
除外)均跳过空白。 因此,通常:
您永远不要在格式字符串中使用\\t
, \\r
或\\n
( %[
.. ]
内除外),因为这只会使人感到困惑。 使用空格代替,它执行相同的操作
您应该避免在格式字符串中使用多余的空格,因为它们没有任何作用,只会使人们感到困惑。
这样,您的sscanf
调用将变为:
sscanf("%d%d ...%d 0x0A",
清楚地说,它读取两个数字,然后读取三个句点,接着读取另一个数字,最后读取字符串0x0A
(4个字符)。 这6个事物之间(或不存在)之间可能有任何空格,它将被忽略。
就Windows vs Unix而言,对于Windows,在行尾将有多余的回车符( \\r
)。 但是这些只是空白,因此scanf
像其他任何空白一样被跳过。 因此,您可以忽略它们。
Windows中保存的文件将在每个文件末尾\\ r \\ n。 在Linux中,文件末尾只有\\ n。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.