为什么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中添加换行符?
答案 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
。