C 处理后的标准输入到标准输出

C 处理后的标准输入到标准输出,c,stdout,stdin,C,Stdout,Stdin,我有一个实用程序,它应该通过将文件转换为另一种文件格式来优化文件。如果它不能使文件更小,我想返回原始文件 设计是使用stdinin和stdout进行输入和输出。这适用于处理大小大于原始文件大小的情况。所有其他分支都被测试为正常工作 char readbuffer[65536]; ssize_t readinbytes; while ((readinbytes = fread(readbuffer, sizeof(char), insize, stdin)) > 0) {

我有一个实用程序,它应该通过将文件转换为另一种文件格式来优化文件。如果它不能使文件更小,我想返回原始文件

设计是使用
stdin
in和
stdout
进行输入和输出。这适用于处理大小大于原始文件大小的情况。所有其他分支都被测试为正常工作

  char readbuffer[65536];
  ssize_t readinbytes;
  while ((readinbytes = fread(readbuffer, sizeof(char), insize, stdin)) > 0) {
    if (fwrite(readbuffer, sizeof(char), readnbytes, stdout) != readnbytes) {
      fatal("can't write to stdout, please smash and burn the computer\n");
    }
  }

问题这会导致文件大小为0

对,这个问题的答案很奇怪。基本上,我必须将
stdin
读入一个缓冲区(
inbuf
),然后输出该缓冲区的内容。我没有得到任何产出的主要原因是多方面的

  • 首先,我没有发现一个分支,该分支已经确定输入缓冲区是否小于输出缓冲区

    if((readinbytes < outbuffersize) || force) {
        // inside this is where the code was...
    
    勘误表(阅读
    stdin


    我希望这能帮助一些人。

    @PaulOgilvie给出的代码看起来像是“cruft”代表“nothing”。你怎么知道二进制文件中的cruft是什么?在使用stdin之后,我正在尝试将程序开始时的stdin发送到stdout。我知道stdin没有被关闭,但我记得它是一个PITA,如果以前访问过的话。我尝试fseek重置流中的位置,以便可以从stdin的第一个字节读取到最后一个字节。一次最多64k。@WeatherVane尝试将值调整为较小的值,检查更改后的文件大小是否不同。若一个文件有太多的唯一块,那个么并没有保存,所以只需按原样输出文件。我不需要编写程序,在这种情况下,我似乎无法破解它:
    sizeof(char)
    根据定义等于1,并且当您将
    sizeof(readbuffer)
    作为元素数传递时,您已经隐式地使用了这个事实。还应该注意,有更简单、更广泛兼容的方法来处理缓冲区。此外,您还需要处理缓冲区溢出,或者为n长度的文件重新分配内存空间(这会占用RAM)。我提出的最终解决方案(仍然没有合并到上游)允许通过CLI参数使用最大大小的读取字节选项。
    set_filemode_binary(stdout);
    if (fwrite(inbuf, 1, readinbytes, stdout) != insize) {
        fprintf(stderr, "error writing to stdout\n");
        free(inbuf);
        exit(3);
    }
    
    unsigned char * inbuf = NULL;
    size_t readinbytes;
    long insize = 0;
    
    // elsewhere...
    
    // die if no stdin
    insize = getFileSize(stdin);
    if (insize < 0) {
        fprintf(stderr, "no input to stdin\n");
        exit(2);
    }
    // read stdin to buffer
    inbuf = createBuffer(insize); // wrapper around malloc handling OOM
    if ((readinbytes = fread(inbuf, sizeof(char), insize, stdin)) < 0) {
        fprintf(stderr, "error reading from stdin\n");
        free(inbuf);
        exit(3);
    }
    
    if(inbuf){ free(inbuf); }