C Pthreads、fread()和printf():获取随机D4';这是我的事 独家新闻:

C Pthreads、fread()和printf():获取随机D4';这是我的事 独家新闻:,c,pthreads,printf,fread,C,Pthreads,Printf,Fread,我正在创建一个方法,该方法在一个长文件中分块运行:使用pthreads。我正在调用fread()以这种方式读取文件: fread( thread_data[i].buffer, 1, 50, f ) /* thread_data is a data structure for each thread (hence i) buffer is in thread_data as an array of length 50 */ 然后我直接调用一个print语句来查看每个线程都在做什么,因为在

我正在创建一个方法,该方法在一个长文件中分块运行:使用
pthreads
。我正在调用
fread()
以这种方式读取文件:

fread( thread_data[i].buffer, 1, 50, f )
/*
 thread_data is a data structure for each thread (hence i)
 buffer is in thread_data as an array of length 50
 */
然后我直接调用一个print语句来查看每个线程都在做什么,因为在我打印的一些部分中出现了一个奇怪的模式也就是说,我的打印语句看起来像这样

 this is suppose to be 50 characters, but it is only a fewgD4
正上方的
D4
就是我的问题所在。我制作的每一个线程,在字符串的末尾,我们都在打印
D4
,在本例中,后面跟着一个
g
。其他时候,它后面是d,最常见的是a�. 现在,在这个字符上,它表示:

替换字符用于替换未知或不可表示的字符

我的问题: 我遇到了什么样的错误?为什么每个read语句的结尾都包含未知字符,特别是奇怪的
gD4
家伙

旁白:
我试图在中创建一个函数,它利用pthreads查找文件中每个单词的频率,以防有人怀疑。这些奇怪的角色出现在我的名单上,这让我有点不快。最后,我已经意识到了这一点,并且字符并不在我正在使用的范围之外。

您正在打印的字符串不是以null结尾的-
fread()
不以null结尾它的输出,它只是按照您要求的数量(或更少)读取原始字节。因此,当您打印出缓冲区时,您的打印函数将经过数据的末尾,并打印出缓冲区后面的任何垃圾内存,在您的情况下,这恰好是
gD4

您需要显式null或终止缓冲区;或者,如果您的打印功能支持它,请确切地告诉它要打印多少个字符。无论哪种方式,您都需要保存
fread
中的返回值,以了解您读取了多少个字符。例如:

int n = fread(thread_data[i].buffer, 1, 50, f);
if (n < 0) /* Handle error */ ;

// Explicitly add a null terminator -- make sure the buffer has room for it!
thread_data[i].buffer[n] = 0;
intn=fread(线程数据[i]。缓冲区,1,50,f);
如果(n<0)/*处理错误*/;
//显式添加空终止符——确保缓冲区有空间容纳它!
线程_数据[i]。缓冲区[n]=0;

感谢您昨晚的快速回复。如果你不介意的话,我想知道我是否可以让你在这件事上再想一想。也就是说,有没有一种方法可以获取类似于
(thread_data[i].buffer)[9]