为什么 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
。