test.c的
int main() {
int fd = open("/test/aaa",O_RDONLY);
char * str;
int len;
str = (char*)malloc(sizeof(char));
len = read(fd,str,100);
close(fd);
printf("%s\n",str);
free(str);
str = NULL;
return 0;
}
输出如下:
$echo 300 > /test/aaa
$gcc test.c -o test
$./test
300
$
为什么这里有换行输出?有没有一种安全的方法可以驾驭它?或者我以错误的方式使用read()? 谢谢!
答案 0 :(得分:4)
因为文件中有换行符,如果你用以下内容转储它,你会看到它:
od -xcb /test/aaa
它在文件中的原因是因为你把它放在那里:echo
的默认行为是写你给它的东西加上一个换行符。
如果您不想要换行符,请使用:
echo -n 300 >/test/aaa
此外,您还没有在malloc
中分配足够的空间来存储除单个字符以外的任何内容,您可能需要尝试:
str = malloc (100);
您还会注意到我不转换malloc
的返回值 - 这是C中的一个坏习惯,它完全能够隐式地转换void *
返回任何其他指针。如果您明确施放,它可以隐藏某些微妙的错误。
这也是sizeof(char)
总是 1的假设,所以你不需要将它乘以任何东西。
老实说,如果我想要基于行的文件输入,read
将不是我的首选。有很多更好的选择,例如fgets
来做这类事情。
答案 1 :(得分:1)
你读到的文件可能已经在最后有了换行符。请记住,read
读取的内容与您说的一样多。
当您使用printf
时,您要求添加另一个换行符。
这就是为什么你得到两个换行符。
编辑:您还在程序的多个位置导致未定义的行为。
你是malloc
空格1个字符,但你要存储100个字节。
此外,你不是null终止字符串,这意味着printf
将读取字符,直到它遇到空字节或崩溃。它甚至可以将字符读到宇宙的尽头。
答案 2 :(得分:1)
您的代码中有未定义的行为:
str = (char*)malloc(sizeof(char));
这里只分配一个字节!然后继续读取100个字节进入该存储区。并且您将分配的内存视为字符串,但是您没有正确终止字符串,从而导致另一种可能的未定义行为情况。而且,您甚至无法检查read
或malloc
来电中是否存在错误。
顺便说一下,sizeof(char)
总是是1
,你永远不应该归还malloc
。
答案 3 :(得分:0)
因为默认情况下echo
会在行尾添加换行符。这就是你的文件以换行符结束的原因。
您可以使用echo -n 300 > /test/aaa
停用此功能。
答案 4 :(得分:0)
这是因为你把它放在那里:
printf("%s\n",str);
也许你的意思是:
printf("%s",str);
现在你只能得到文件包含的内容。当然,文件最后可能包含自己的换行符。
答案 5 :(得分:0)
$echo -n 300 > /test/aaa
-n将避免新行