0

出于某种原因,当我尝试使用 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]);
4

2 回答 2

0

fflush(toSort)之后使用fputs()

于 2013-11-10T23:34:52.413 回答
0

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

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

此外,您不是 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);
于 2013-11-10T23:59:11.993 回答