我的任务是通过ipc共享内存制作文件副本。问题是getc在32k char之后随机发生了EOF。
FILE* file;
int znak;
file = fopen("./source","r");
if(file != NULL)
{
while(feof(file) == 0)
{
znak = getc(file);
if(znak != EOF)
{
czekaj(0);
*adres = znak;
sygnal(1);
}
}
wait(0); //Wait for your turn
*adres = EOF;
signal(1); //Let other process go
}
按要求书写部分
int znak
FILE *plik;
plik = fopen("./plik_klient", "w");
fclose(plik);
.....
plik = fopen("./result","a");
if(plik != NULL)
{
while(znak != EOF)
{
wait(1); //Opuszczenie semafora
znak=*adres;
if(znak != EOF)
{
fputc(znak,plik);
signal(0);
}
}
}
作为工作的结果,其他进程读取信息并将其写入文件。
-rw-r--r--. 1 ficekba inf-17 32769 01-11 21:15 result
-rw-r--r--. 1 ficekba inf-17 1000000 01-11 21:13 source
正如您所见,结果文件正好有32k
答案 0 :(得分:1)
代码在char znak
最佳时使用int znak
。
getc()
返回int
和unsigned char
范围内的EOF
。这通常是257个不同的值:[ - 1 ... 255]。当代码读取文件source
并且可能返回255并将其分配给char znak
时,znak
的值为-1,在这种情况下匹配EOF
。这种愚弄代码的思维复制已经完成。因此最终会得到一个臀部result
文件。
使用int znak
。
同样以二进制模式打开文件source
可能是二进制文件。
// file = fopen("./source","r");
file = fopen("./source","rb");