我需要按照标题所述的方式进行操作。限制是消费者和生产者只有12个插槽可以容纳20个字符。除了上一个制作人只输入13个字符(这是正确的)之外,我已经开始工作了,最后一个消费者不会认识到这一点。它写了20个字符,在我复制的文件的末尾添加了一些额外的字符。我已经考虑了一些问题,但找不到合适有效的解决方案让消费者认识到插槽中只有13个字符。我使用了跟随2行来生成和使用(两者都正确使用信号量并且同时在不同的线程上运行)。
由手头的问题给出:
#define SLOTSIZE 20
#define SLOTCNT 12
char buffer[SLOTCNT][SLOTSIZE];
制片:
count = fread(buffer[pIndex], sizeof(char), sizeof(buffer[pIndex]), myFile);
消费者:
count = fwrite(buffer[cIndex], sizeof(char), sizeof(buffer[cIndex]), myFile);
这是一项受欢迎的家庭作业,所以我不想发布很多代码。有任何想法吗?我相信在最后13个字符的末尾我需要一个EOF标记因为我认为它被抛出了。
P.S。再次为生产者,最后一次读取的结果使得count = 13;对于消费者来说,最后一次写入使得count = 20并且额外的字符在输出文件中。
答案 0 :(得分:1)
只有大量的示例代码,如果没有一些猜测就很难给出正确的答案。
您的问题似乎是您不知道编写器中缓冲区中的有效字节数。
buffer
似乎是一个char数组的数组?如果是,您可以将其改为结构数组,例如:
struct buf
{
int used_length;
char b[20];
};
struct buf buffer[20];
然后执行以下操作:
生产者:
buffer[pIndex].used_length = count = fread(buffer[pIndex].b, sizeof(char), sizeof(buffer[pIndex].b), myFile);
消费者:
count = fwrite(buffer[cIndex].b, sizeof(char), buffer[cIndex].used_length, myFile);
这样你只会写出你读的字节数。