为什么文件中的read()始终以断行结束

时间:2013-05-15 09:17:45

标签: c readfile

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()? 谢谢!

6 个答案:

答案 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个字节进入该存储区。并且您将分配的内存视为字符串,但是您没有正确终止字符串,从而导致另一种可能的未定义行为情况。而且,您甚至无法检查readmalloc来电中是否存在错误。

顺便说一下,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将避免新行