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