【问题标题】:C File read getchar yields random EOF after 32KBC 文件读取 getchar 在 32KB 后产生随机 EOF
【发布时间】:2018-01-11 20:22:41
【问题描述】:

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

【问题讨论】:

标签: c ipc file-handling


【解决方案1】:

int znak 最好时,代码使用char znak

getc()unsigned charEOF 的范围内返回一个int。这通常是 257 个不同的值:[-1 ... 255]。当代码读取文件 source 并可能返回 255 并将其分配给 char znak 时,znak 的值 -1 在这种情况下与 EOF 匹配。这使代码误以为复制已完成。所以最终可能会得到一个 result 文件。

使用int znak


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

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

【讨论】:

  • 完成,没有效果
  • 当 int znak 最好时,代码使用 char znak -> 需要int znak
  • 是的,我已经修改过了。
  • @EdHeal int znak 不是必需的——尽管int 通常是最好的。来自getc() 的值在unsigned charEOF 的范围内。应使用intunsigned char/unsigned 类型。在UCHAR_MAX > INT_MAX 的选定平台上,难以区分文件结尾和字符(unsigned char) EOF,并且需要更复杂的代码。这样的代码经常使用unsigned char/unsigned作为getc()的存储返回值。
  • getc 返回int - 所以将其存储在int 中。即超过8位。 unsigned char /char (通常)是 8 位。请告诉我UCHAR_MAX > INT_MAX是什么平台
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多