C Linux文件操作测试程序不';I don’我没有表现得像预期的那样
有人能给我解释一下为什么打印以下测试程序: abcde 福吉 杰克利 m 谎言 m 谎言 而不是: abcde 福吉 杰克利 姆克利 姆克利 该计划是:C Linux文件操作测试程序不';I don’我没有表现得像预期的那样,c,linux,system-calls,C,Linux,System Calls,有人能给我解释一下为什么打印以下测试程序: abcde 福吉 杰克利 m 谎言 m 谎言 而不是: abcde 福吉 杰克利 姆克利 姆克利 该计划是: #include <unistd.h> #include <fcntl.h> #include <stdio.h> char buffer[16]; void main() { int fd=open("bb",O_RDONLY); int i; for(i=5;i>0;i--)
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
char buffer[16];
void main()
{
int fd=open("bb",O_RDONLY);
int i;
for(i=5;i>0;i--)
{
read(fd,buffer,i);
printf("%s\n",buffer);
}
}
#包括
#包括
#包括
字符缓冲区[16];
void main()
{
int fd=打开(“bb”,仅限Ordu);
int i;
对于(i=5;i>0;i--)
{
读取(fd,缓冲器,i);
printf(“%s\n”,缓冲区);
}
}
文件bb包含以下序列:abcdefghijklm
buffer
包含“abcde\0\0\0\0\0\0\0\0\0”和fd
指向“f”buffer
包含“fghie\0\0\0\0\0\0\0\0”和fd
指向“j”buffer
包含“jklie\0\0\0\0\0\0\0\0”和fd
指向“m”buffer
包含“m\nlie\0\0\0\0\0\0\0\0\0”并且fd
位于文件末尾缓冲区中没有任何更改
buffer
被初始化为零
buffer
包含“abcde\0\0\0\0\0\0\0\0\0”和fd
指向“f”buffer
包含“fghie\0\0\0\0\0\0\0\0”和fd
指向“j”buffer
包含“jklie\0\0\0\0\0\0\0\0”和fd
指向“m”buffer
包含“m\nlie\0\0\0\0\0\0\0\0\0”并且fd
位于文件末尾缓冲区中没有任何更改
请注意,代码依赖于全局变量
buffer
被初始化为零。您的缓冲区不是以null结尾的。在每次调用fread
之前,调用memset
将其初始化为全零。检查open
和fread
中的返回代码也是一个好主意。read()
函数不为null并终止其输入。如果真是这样,那将是一场灾难。你知道它读了多少字节。不要打印更多!可能bb
文件末尾有一个换行符,当i==2
时,该换行符将被读入缓冲区。在read
add之后:buffer[i]='\0'代码>@DanielSchepler,也许这就是重点。Vi说bb文件有14个字符长,但应该是13个字符(只有字母a-m),在“catbb”命令之后,promt出现在下一行。显然你是对的,但不知何故,我不知道为什么vi会在每次保存文件时自动将这个“\n”字符放在最前面。如何删除它?缓冲区不是以null结尾的。在每次调用fread
之前,调用memset
将其初始化为全零。检查open
和fread
中的返回代码也是一个好主意。read()
函数不为null并终止其输入。如果真是这样,那将是一场灾难。你知道它读了多少字节。不要打印更多!可能bb
文件末尾有一个换行符,当i==2
时,该换行符将被读入缓冲区。在read
add之后:buffer[i]='\0'代码>@DanielSchepler,也许这就是重点。Vi说bb文件有14个字符长,但应该是13个字符(只有字母a-m),在“catbb”命令之后,promt出现在下一行。显然你是对的,但不知何故,我不知道为什么vi会在每次保存文件时自动将这个“\n”字符放在最前面。如何删除它?Lunix是否希望文本文件以换行结束?我见过编译器抱怨源文件没有,但我不确定这是否只是一个惯例或其他什么是的,这就是重点。非常感谢。但是现在我不明白为什么每次我保存文件并退出vi编辑器时,“\n”都会弹出?在保存前,我不按Enter,也不键入-N。我认为对于该抱怨的粗略理由是考虑文本文件的“语法”:<代码> Trtext Fix:= Lead *;行:=(可打印*非空格|可打印|空)'\n'
因此,结尾没有换行的非空文件充其量是一个不完整的文本文件。(另外,还有一个实用的解释,即如果textfile
末尾缺少换行符,cat textfile
会弄乱shell提示符的格式。)换句话说,借用有关Pascal和C之间区别的术语:\n
被视为行终止符而不是行分隔符。Lunix是否希望文本文件以换行符结尾?我见过编译器抱怨源文件没有,但我不确定这是否只是一个惯例或其他什么是的,这就是重点。非常感谢。但是现在我不明白为什么每次我保存文件并退出vi编辑器时,“\n”都会弹出?在保存前,我不按Enter,也不键入-N。我认为对于该抱怨的粗略理由是考虑文本文件的“语法”:<代码> Trtext Fix:= Lead *;行:=(可打印*非空格|可打印|空)'\n'
因此,结尾没有换行的非空文件充其量是一个不完整的文本文件。(另外,还有一种实用的解释,即如果textfile
末尾缺少换行符,cat textfile
会弄乱shell提示符的格式。)换句话说,借用有关Pascal和C之间区别的术语:\n
被视为行终止符而不是行分隔符。