C文件读取getchar在32KB后产生随机EOF
我的任务是通过ipc共享内存复制文件。问题是getc在32k个字符后随机产生EOFC文件读取getchar在32KB后产生随机EOF,c,ipc,file-handling,C,Ipc,File Handling,我的任务是通过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); *adre
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
正如您所看到的,当
int-znak
最好时,结果文件正好有32k代码使用char-znak
getc()
返回int
范围内的unsigned char
和EOF
。这通常是257个不同的值:[-1…255]。当代码读取文件source
并可能返回255并将其分配给char znak
时,znak
的值为-1,在这种情况下与EOF
匹配。这愚弄了代码,使其认为复制已经完成。因此,最终可能会得到一个臀部结果
文件
使用int-znak
另外,以二进制模式打开的文件是
源文件
可能是二进制文件
// file = fopen("./source","r");
file = fopen("./source","rb");
所以“随机”或“32K后”?可能是@Yunnosch的副本我不认为它是副本…“复制文件”,以二进制模式打开<代码>fopen(“/来源”,“rb”)代码>添加bYou既有
信号
又有信号
,等待
和czekaj
。。。好的,请,或者VTC。完成,当int-znak最好时,没有效应代码使用字符znak->int-znak
是必需的。是的,我修改了它。@EdHealint-znak
不是必需的-尽管int
通常是最好的。getc()
中的值在unsigned char
和EOF
的范围内。应使用int
或无符号字符/无符号
类型。在UCHAR\u MAX>INT\u MAX
的特定平台上,很难区分文件结尾和字符(无符号字符)EOF
,需要更复杂的代码。这类代码通常使用unsigned char/unsigned
作为getc()
的存储返回值。请getc
返回一个int
——因此将其存储在int
中。i、 e.超过8位<代码>无符号字符/字符
通常为8位。请告诉我哪个平台的UCHAR\u MAX>INT\u MAX
是正确的