C文件读取getchar在32KB后产生随机EOF

C文件读取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

我的任务是通过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

正如您所看到的,当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
是必需的。是的,我修改了它。@EdHeal
int-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
是正确的