2015-10-16 99 views
-2

该程序读取文件的内容并通过管道发送它们。我在读取子进程中的管道时遇到问题。我的输出文件中的内容是方块字符。我想我必须将c从一个地址改为一个值?从C中的管道读取字符

if (pid > 0) { /* parent */ 
/* close the end of the pipe we do not need */ 
close(pfd[0]); 

/* read from the input file and write to the pipe */ 
while ((c = getc(from)) != EOF){ 
    if (flipping){ 
     c = flipChar(c); 
     write(pfd[1],&c, 1); 
    } 
    else 
     write(pfd[1],&c, 1); 

} 

    fclose(from); 
    close(pfd[1]); 

    wait(NULL); 
} 
else{ /* child process */ 

     close(pfd[1]); 

     while (c = read(pfd[0],&c,1)) 
     { 
     /* change c from a address to value?? */ 
     putc(c, destfile); 
     } 

     fclose(destfile); 
     close(pfd[0]); 
} 

return 0; 
}   
+0

任何错误输出? “有麻烦”的性质是什么? –

回答

0

read()返回读取的字符数。所以你执行read(pfd[0], &c, 1),它在c中存储一个字符,然后立即用值1覆盖该字符(因为你从管道中读取单个字符)。

+0

所以read()函数是我不应该使用的东西?我应该在代码中更改哪些内容,以便从父进程传递的字符在子进程中被拾取? – NuClArPeNgUiN

+0

你正在从你的管道中拾取角色。你正在调用'read()',并且你正在'c'中存储一些东西。这很好。但是在完成之后,你继续覆盖刚刚存储的字符,因为你也正在使用由'read()'生成的返回码(它与您从管道中读取的字符不相同)也变成'c'。 –

+0

换句话说:为什么你期望'read()'从管道返回下一个字符,假设你传递了一个缓冲区来存储事物?如果你想一次读2个或多个字符,你期望'read()'的返回值是什么? –