繁体   English   中英

fgets()读取什么?

[英]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像其他任何空白一样被跳过。 因此,您可以忽略它们。

什么都没有“继续”。 阅读手册页 ,其中明确指出:

如果读取换行符,则将其存储到缓冲区中。

行号编码的差异无关紧要,毕竟它们都是空格,因此在许多情况下被sscanf()跳过了。

Windows中保存的文件将在每个文件末尾\\ r \\ n。 在Linux中,文件末尾只有\\ n。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM