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

时间:2018-01-11 20:22:42

标签: c ipc file-handling

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

1 个答案:

答案 0 :(得分:1)

代码在char znak最佳时使用int znak

getc()返回intunsigned char范围内的EOF。这通常是257个不同的值:[ - 1 ... 255]。当代码读取文件source并且可能返回255并将其分配给char znak时,znak的值为-1,在这种情况下匹配EOF。这种愚弄代码的思维复制已经完成。因此最终会得到一个臀部result文件。

使用int znak

同样以二进制模式打开文件source可能是二进制文件。

// file = fopen("./source","r");
file = fopen("./source","rb");