C 获得'';或'@';使用fread从文本文件读取时的符号
我想从文本文件中读取80个字符,将它们保存到字符串中,然后打印该字符串以进行验证。 我使用的是fread,代码如下:C 获得'';或'@';使用fread从文本文件读取时的符号,c,file,io,fread,C,File,Io,Fread,我想从文本文件中读取80个字符,将它们保存到字符串中,然后打印该字符串以进行验证。 我使用的是fread,代码如下: char message[80]; size_t nread = fread(message, 1, sizeof(message), fp); printf("Message received: \"__%s__\"\n", message); 输出为: 收到信息:“我很想改变世界,但他们不会改变 ��__" 当整个短语不在文件中时 以及: __我很想改变世界,但他们不给我源
char message[80];
size_t nread = fread(message, 1, sizeof(message), fp);
printf("Message received: \"__%s__\"\n", message);
输出为:
收到信息:“我很想改变世界,但他们不会改变
��__"
当整个短语不在文件中时
以及:
__我很想改变世界,但他们不给我源代码@__ 当整个短语都在文件中时 我尝试过删除它并重写文本,但我再次得到相同的输出 怎么了?字符集有问题?没有空终止缓冲区,并且
prinf(“%s”)
希望缓冲区以空终止。由于缓冲区没有空终止,因此printf()
将继续读取,直到找到空终止符,并打印出所有垃圾
null终止缓冲区,记住为null终止符留出空间:
char message[81]; /* Increased by 1 for null terminator. */
size_t nread = fread(message, 1, sizeof(message) - 1, fp);
message[nread] = 0;
printf("Message received: \"__%s__\"\n", message);
或指示printf()
仅打印使用“%.*s”
格式说明符读取的字符数:
printf("Message received: \"__%.*s__\"\n", nread, message);
不为空终止缓冲区,并且prinf(“%s”)
希望缓冲区为空终止。由于缓冲区未为空终止,因此printf()
将继续读取,直到找到空终止符,并打印出所有垃圾
null终止缓冲区,记住为null终止符留出空间:
char message[81]; /* Increased by 1 for null terminator. */
size_t nread = fread(message, 1, sizeof(message) - 1, fp);
message[nread] = 0;
printf("Message received: \"__%s__\"\n", message);
或指示printf()
仅打印使用“%.*s”
格式说明符读取的字符数:
printf("Message received: \"__%.*s__\"\n", nread, message);
太好了!我以为它用消息[nread]='\0';以null终止缓冲区。所以我想我会以null终止它。但是你能解释一下你用printf做什么吗?用'*'我们是指nread变量吗?@Chris,
“%.*s”
是一个格式说明符,需要两个参数:长度和缓冲区。它指示printf()
打印message
中的第一个nread
字符,消除了message
中对空终止符的要求。谢谢!对于printf,我实际上不知道这一点。太好了!我以为它确实用message[nread]空终止了缓冲区='\0';。所以我想我会用null终止它。但是你能解释一下你用printf做什么吗?用'*'我们指的是nread变量?@Chris,“%.*s”
是一个格式说明符,需要两个参数:长度和缓冲区。它指示printf()
打印消息
中的第一个nread
字符,消除了消息
中的空终止符要求。谢谢!我实际上不知道对于printf.@cnicutar,如果它读取80
,那么这将是消息
@hmjd>末尾的一个字符。是的,nread
必须是chec在这之前ked。或者只需将sizeof-1传递给fread
@cnicutar,如果它读取80
,那么这将超过message
@hmjd的末尾,是的,nread
必须在这之前进行检查。或者只需将sizeof-1传递给fread
。