用fputc写一个管道

时间:2013-11-10 23:21:39

标签: c redirect fork pipe

出于某种原因,当我尝试使用fputc写一个管道时,我的程序不起作用;但是,当我使用write系统调用时,它工作正常。以下是使用fputc的代码的一部分:

    FILE *input = fopen(argv[1], "rb");
    FILE *toSort = fdopen(ps_fd[1], "wb");
    /* close the side of pipe I am not going to use */
    close (ps_fd[0]);
    char temp;
    char buf[1];
    while ((temp=fgetc(input)) != EOF)
    {
        buf[0] = (char)temp;
        fputs(buf, toSort);
        buf[0] = '\0';
    }
    fputs(buf, toSort);
    close(ps_fd[1]);

2 个答案:

答案 0 :(得分:0)

fflush(toSort)

之后使用fputs()

答案 1 :(得分:0)

问题标题询问fputc(),但代码(错误)使用fputs()

请注意,fputs()需要以空字符结尾的字符串。它不适合二进制数据;它不会写入零(或空)字节。

此外,您不是null终止字符串。您没有为空终止提供足够的存储空间。您没有正确关闭文件。您应该使用int temp,因为fgetc()会返回int,而不是char。使用fputs()所需的最小更改是:

FILE *input = fopen(argv[1], "rb");
FILE *toSort = fdopen(ps_fd[1], "wb");
close(ps_fd[0]);
int temp;
char buf[2] = ""; // Two characters allocated; null terminated
while ((temp = fgetc(input)) != EOF)
{
    buf[0] = (char)temp;
    fputs(buf, toSort);
}
fclose(toSort);  // fclose() to flush the buffered data

或者,使用fputc()

FILE *input = fopen(argv[1], "rb");
FILE *toSort = fdopen(ps_fd[1], "wb");
close(ps_fd[0]);
int temp;
while ((temp = fgetc(input)) != EOF)
    fputc(temp, toSort);
fclose(toSort);