linux中的read调用是否在EOF中添加换行符?

时间:2018-06-10 15:01:14

标签: c linux newline eof

为什么linux中的文件上的read()在EOF中添加一个换行符,即使该文件确实没有换行符?

我的文件数据是:

1hello2hello3hello4hello5hello6hello7hello8hello9hello10hello11hello12hello13hello14hello15hello

我对这个文件的read()调用应该在读完“15hello”中的最后一个'o'后点击EOF。我使用以下内容:

while( (n = read(fd2, src, read_size-1)) != 0) // read_size = 21
{
    //... some code
    printf("%s",src);
    //... some code
}

其中fd2是文件的描述符。在最后一个循环中,n是17,我有src [16] ='\ n'。那么......,linux中的读取调用是否在EOF中添加换行符?

2 个答案:

答案 0 :(得分:1)

  

linux中的read调用是否在EOF中添加换行符?

没有

您的输入文件可能有一个终止换行符 - 大多数格式良好的文本文件都有,因此可以连接多个文件而不会一起运行。

您也可能遇到已经在缓冲区中的杂散换行符,因为read()不会终止使用NUL字符读取的数据来创建实际的C样式字符串。而且我猜你的代码也没有,否则你会发布它。这意味着你的

printf("%s",src);

很可能是未定义的行为。

答案 1 :(得分:0)

为什么对linux文件中的read()在EOF中添加一个换行符,即使该文件确实没有换行符? ,{{1系统调用不会在文件末尾添加任何新行。

您遇到此类行为,因为可能是您使用read()命令创建了文本文件,请注意,如果您使用vi创建了文件,则会添加默认新行。

您可以使用vi创建一个空文本文件,然后在其上运行vi命令,在系统上对此进行验证。

如果您知道文件大小(使用wc系统调用查找大小),也可以使用read()系统调用一次读取文件数据,并且可以避免stat()循环。

这个

while

更改为

while( (n = read(fd2, src, read_size-1)) != 0) { 
   /* some code */
}

现在你有struct stat var; stat(filename, &var); /* check the retuen value of stat()..having all file info now */ off_t size = var.st_size; 个文件,创建一个等于size的动态或堆栈数组,并从文件中读取数据。

size

现在一次读取所有数据,如

char *ptr = malloc(size + 1);

最后一旦完成工作,请不要忘记通过拨打read(fd,ptr,size);/*now ptr having all file contents */ 来释放ptr