加工后stdin到stdout

时间:2017-10-25 14:39:15

标签: c stdout stdin

我有一个实用程序可以通过将文件转换为备用文件格式来优化文件。如果它不能使文件变小,我希望原始文件返回。

设计是使用stdout in和 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"); } } 进行输入和输出。这适用于处理后的大小大于原始文件大小的情况。所有其他分支都经过测试。

td

问题这导致文件大小为0

1 个答案:

答案 0 :(得分:0)

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

  1. 首先,我找不到已经确定输入缓冲区是否小于输出缓冲区的分支

    if((readinbytes < outbuffersize) || force) {
        // inside this is where the code was...
    
  2. 看起来(因为stdout用于写入)有一个部分包含一个未在匹配的else块中输出的日志语句。继承的代码格式非常糟糕,因此从未接受过。

    由于输出错误消息不符合实用程序的目的(如果提供了有效的输入文件,则始终输出有效的输出文件)

  3. 解决方案stdin在程序开头读入inbuf

    set_filemode_binary(stdout);
    if (fwrite(inbuf, 1, readinbytes, stdout) != insize) {
        fprintf(stderr, "error writing to stdout\n");
        free(inbuf);
        exit(3);
    }
    

    勘误(阅读stdin

    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);
    }
    

    同时不要忘记free(inbuf)

    if(inbuf){ free(inbuf); }
    

    我希望这有助于某人。