C语言 Linux 中的读取调用是否在 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,i 有 src[16] = ''。 那么......,linux中的读取调用是否在EOF上添加了换行符?

Linux 中的读取调用是否在 EOF 中添加了换行符?

不。

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

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

printf("%s",src);

很可能是未定义的行为。

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

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

您可以通过使用vi创建一个空文本文件,然后在该文本文件上运行wc命令来在系统上验证这一点。

如果您知道文件大小(使用stat()系统调用查找大小(,也可以使用系统调用一次读取文件数据read()并且可以避免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 */

终于,一旦工作完成,不要忘记通过拨打free(ptr)来释放ptr

最新更新