如何将数据传递给在Linux中调用scanf()和read()的程序

如何将数据传递给在Linux中调用scanf()和read()的程序,第1张

概述我有一个C程序,看起来像这样: #include <stdio.h>#include <unistd.h>int main(){ int n; char str[16]; scanf("%d", &n); printf("n: %d\n", n); int count = read(STDIN_FILENO, str, 16); print 我有一个C程序,看起来像这样:

#include <stdio.h>#include <unistd.h>int main(){    int n;    char str[16];    scanf("%d",&n);    printf("n: %d\n",n);    int count = read(STDIN_fileNO,str,16);    printf("str: %s\n",str);    printf("read %d bytes\n",count);}

如果我使用类似命令将数据传输到此程序中

(echo -en '45\n'; echo -en 'text\n') | ./program

只有scanf()实际读取数据. read()只读取0个字节.

换句话说,程序输出

n: 45str:read 0 bytes

如何将数据传输到scanf()和read()?

编辑:对不起,我应该澄清:我正在寻找一种方法来做到这一点,而无需修改源代码.感谢那些回答和评论的人.

解决方法 根本不建议对同一文件描述符使用文件描述符函数(读取)和流函数(scanf).使用file *的函数(即fread / fprintf / scanf / …)是缓冲数据,而使用文件描述符(即读/写/ …)的函数不使用那些缓冲区.在您的情况下,修复程序的最简单方法是使用fread而不是read.该计划可能如下所示:

#include <stdio.h>#include <unistd.h>int main() {  int n;  char str[16];  scanf("%d",&n);  printf("n: %d\n",n);  int count = fread(str,16,1,stdin);  printf("str: %s\n",str);  printf("read %d bytes\n",count);}

在您的原始示例中,scanf已经读取了前面的输入并将其存储在其缓冲区中.因为输入很短并且可以立即使用,所以它完全被读取到缓冲区并且您的读取调用没有更多要阅读.

直接从终端输入输入时不会发生这种情况,因为从终端设备读取时,scanf不会将数据缓冲超过一行.如果您通过命令在管道输入中创建时间暂停,也不会发生这种情况:

(echo -en '45\n'; sleep 1; echo -en 'text\n') | ./program
总结

以上是内存溢出为你收集整理的如何将数据传递给在Linux中调用scanf()和read()的程序全部内容,希望文章能够帮你解决如何将数据传递给在Linux中调用scanf()和read()的程序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1025791.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存