C 为什么从文件中读取()总是以特征线结尾

C 为什么从文件中读取()总是以特征线结尾,c,readfile,C,Readfile,测试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; } 为

测试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;
}
为什么这里有换行输出?有没有安全的方法骑着它?还是我使用read()的方式不对?
谢谢

您读入的文件末尾可能已经有一个换行符。记住,
read
读多少就读多少

使用
printf
时,您正在请求添加另一个换行符

这就是为什么你会收到两条新线

编辑:您还在程序中的多个位置导致未定义的行为

您正在
malloc
为1个字符分配空间,但您正在向其中存储100个字节


此外,终止字符串不能为null,这意味着
printf
将读取字符,直到遇到null字节或崩溃。它甚至可以一直读到宇宙的尽头。

你读到的文件的结尾可能已经有了新行。记住,
read
读多少就读多少

使用
printf
时,您正在请求添加另一个换行符

这就是为什么你会收到两条新线

编辑:您还在程序中的多个位置导致未定义的行为

您正在
malloc
为1个字符分配空间,但您正在向其中存储100个字节


此外,终止字符串不能为null,这意味着
printf
将读取字符,直到遇到null字节或崩溃。它甚至可以一直读到宇宙的尽头。

因为默认情况下,
echo
会在行尾添加一个换行符。这就是文件以换行符结尾的原因


您可以使用
echo-n 300>/test/aaa

禁用此功能,因为默认情况下
echo
会在行尾添加一个换行符。这就是文件以换行符结尾的原因


您可以使用echo-n300>/test/aaa禁用此功能,因为您将它放在了那里:

$echo 300 > /test/aaa
$gcc test.c -o test
$./test
300

$
也许你的意思是:

printf("%s\n",str);

现在您将只获得文件包含的内容。当然,文件的结尾可能包含自己的换行符。

这是因为您将其放在了那里:

$echo 300 > /test/aaa
$gcc test.c -o test
$./test
300

$
也许你的意思是:

printf("%s\n",str);

现在您将只获得文件包含的内容。当然,文件的结尾可能包含自己的换行符。

因为文件中有一个换行符,如果您使用以下内容转储它,您将看到该换行符:

printf("%s",str);
它出现在文件中的原因是你把它放在了那里:
echo
的默认行为是写你给它的东西加上一个换行符

如果不需要换行符,请使用:

od -xcb /test/aaa

此外,您在
malloc
中没有分配足够的空间来存储除单个字符以外的任何内容,您可能需要尝试:

echo -n 300 >/test/aaa
您还会注意到,我没有强制转换
malloc
的返回值,这在C中是一个坏习惯,它完全能够隐式地将返回的
void*
强制转换为任何其他指针。如果显式强制转换,它可以隐藏某些细微错误

另外,C中的
sizeof(char)
始终为1,因此不需要将其乘以任何值



老实说,如果我想要基于行的文件输入,
read
不是我的第一选择。有很多更好的选项,比如
fgets
,用于做这类事情。

因为文件中有一个换行符,如果您使用以下内容转储它,您会看到它:

printf("%s",str);
它出现在文件中的原因是你把它放在了那里:
echo
的默认行为是写你给它的东西加上一个换行符

如果不需要换行符,请使用:

od -xcb /test/aaa

此外,您在
malloc
中没有分配足够的空间来存储除单个字符以外的任何内容,您可能需要尝试:

echo -n 300 >/test/aaa
您还会注意到,我没有强制转换
malloc
的返回值,这在C中是一个坏习惯,它完全能够隐式地将返回的
void*
强制转换为任何其他指针。如果显式强制转换,它可以隐藏某些细微错误

另外,C中的
sizeof(char)
始终为1,因此不需要将其乘以任何值


老实说,如果我想要基于行的文件输入,
read
不是我的第一选择。有很多更好的选择,比如
fgets
,用于做这类事情。

您的代码中有未定义的行为:

str = malloc (100);
这里只分配一个字节!然后继续向该内存区域读取100字节。您将分配的内存视为一个字符串,但没有正确终止该字符串,从而导致另一种可能的未定义行为情况。您甚至不检查
read
malloc
调用中可能出现的错误

顺便说一句,
sizeof(char)
始终是
1
,并且您不应该强制执行
malloc

的返回,因为您的代码中有未定义的行为:

str = malloc (100);
str = (char*)malloc(sizeof(char));
这里只分配一个字节!然后继续向该内存区域读取100字节。您将分配的内存视为一个字符串,但没有正确终止该字符串,从而导致另一种可能的未定义行为情况。您甚至不检查
read
malloc
调用中可能出现的错误

顺便说一句,
sizeof(char)
始终是
1
,并且您不应该强制执行
malloc
的返回

str = (char*)malloc(sizeof(char));
-n将避开新线


-n将避免新行

,但此处实际上有两个换行符(在printf中包括一个“\n”)。如果没有换行符,输出应该是:
300$
,对吗?但这里实际上有两个换行符(在printf中包括一个“\n”)。如果没有换行符,输出应该是:
300$
,对吗?