[英]C File read getchar yields random EOF after 32KB
我受命在ipc共享内存上进行文件复制。 问题是getc在32k字符后随机产生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
int znak
最佳时,代码使用char 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");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.