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