fgets()读取什么?

时间:2014-06-23 09:12:26

标签: c windows unix newline fgets

我必须将程序从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同时保持那种奇怪的逻辑)?

3 个答案:

答案 0 :(得分:3)

scanf格式字符串中的换行符并不专门在输入中查找换行符 - 它只是跳过空格(任何空格)。制表符相同。此外,大多数 scanf格式说明符(除%c%[之外的所有内容)都会跳过空格。所以一般来说:

  • 永远不会在格式字符串中使用\t\r\n%[中除外} {{ 1}}),因为它会让人迷惑。使用空格代替,这可以做同样的事情

  • 你应该避免在格式字符串中使用冗余空格,因为它们没有任何东西,只会让人感到困惑。

因此,通过以上操作,您的]电话会变为:

sscanf

清楚地说明这会读取两个数字,然后是三个句点,然后是另一个数字,最后是字符串sscanf("%d%d ...%d 0x0A", (4个字符)。

可能会忽略这6个事物中的任何一个(或不是)之间的任何空白。

就Windows与Unix而言,对于Windows,在行尾会有额外的回车符(0x0A)字符。但这些只是空格,因此\r将像任何其他空格一样被跳过。所以你可以忽略它们。

答案 1 :(得分:0)

没有什么是“继续”。请read the manual page,其中明确指出:

  

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

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

答案 2 :(得分:0)

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