Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 获得'࿽';或'@';使用fread从文本文件读取时的符号_C_File_Io_Fread - Fatal编程技术网

C 获得'࿽';或'@';使用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); 输出为: 收到信息:“我很想改变世界,但他们不会改变 ��__" 当整个短语不在文件中时 以及: __我很想改变世界,但他们不给我源

我想从文本文件中读取80个字符,将它们保存到字符串中,然后打印该字符串以进行验证。 我使用的是fread,代码如下:

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