我有一个c程序,它从stdin中读取整数值。我编写了一个nodejs程序来执行c文件,nodejs程序将读取一个文本文件(包含多行中的数字)并将此数据传递给子进程的stdin。
问题是,如果txt文件中的输入数小于预期数,则子进程将提供值0.我希望子进程等待直到收到数据。
c program
#include<stdio.h>
int main(){
int a;
printf("hekllowworls");
scanf("%d",&a);
printf("%d",a);
scanf("%d",&a);
printf("%d",a);
scanf("%d",&a);
printf("%d",a);
}
节点JS程序
var fs = require('fs'),
cp = require('child_process');
stream = fs.createReadStream('myfile.txt');
var obj = cp.spawn('/home/arju/Desktop/exec/a.out');
stream.pipe(obj.stdin);
obj.stdout.on('data',function(data){
console.log(data.toString());
});
obj.on('error',function(err){
console.log(err);
});
TextFile - Myfile.txt
10
20
答案 0 :(得分:0)
根据man scanf
The value EOF is returned if the end of input is reached before either
the first successful conversion or a matching failure occurs. EOF is
also returned if a read error occurs, in which case the error indicator
for the stream (see ferror(3)) is set, and errno is set indicate the
error.
我觉得你应该使用类似的东西:
r = scanf("%d",&a);
if (r != EOF) { ...
逻辑上,简单等待数据可能如下所示:
while(r = scanf("%d",&a)) {
if (r == EOF) continue;
printf("%d",a);
}
据我所知,您应该使用无缓冲的IO操作,例如读/写系统控制。试试这个:
int main(){
int n;
char buf[255];
while(1) {
while((n = read(0,buf,sizeof(buf))) != 0){
write(1,buf,n);
}
}
}
从write() to stdout and printf output not interleaved?获取信息,好的答案,检查出来。
您的C程序从缓冲区读取值。在我的第一个例子中,它等待数据填充输出缓冲区,所以我没有输出。
只需对代码进行少量修改,您就可以在每次fflush(stdout)
来电后使用printf
。
如果您无法编辑代码,请查看unix.stackexchange:https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe中的这个答案,有两个很好的解决方案。 (我更喜欢第二种,因为它来自coreutils)。