【问题标题】:c wait for stdin read?c 等待标准输入读取?
【发布时间】:2012-02-06 08:09:50
【问题描述】:

在我的应用程序中,我正在尝试实现这样的目标:

我有:

  • 数据 0,数据 1,数据 2,...数据 n。
  • 需要传递的一些参数

流程:

  1. 用一些参数启动程序并将数据0写入标准输入
  2. 程序根据传入的数据“data 0”和参数进行计算
  3. “等待”新标准输入和(清除旧标准输入、缓冲区和变量?)
  4. 当我输入数据 1、数据 2 时重复 1 ~2... 以此类推
  5. 当到达数据 n 时,终止(或者如果我向标准输入输入一个中止代码,告诉程序终止)。

可能是这样的?(伪代码):

int main(int argc, char *argv[])
{
get parameters();
int fslen = data size
char *c = (char *)malloc(fslen);
fgets(c, fslen, stdin);

while((c != null) || (c != Terminate code?))
{       
    do calculations with int c;
    clear c;
}
return 0;
}

或者他们是更好的方法?

或者以这种方式做事只是不好的做法? 如果有,请解释

【问题讨论】:

    标签: c while-loop stdin wait flow


    【解决方案1】:

    至少据我所知,读取和解析行输入确实没有比读取和解析行输入更好的方法了。

    默认情况下,标准输入应该是阻塞的,所以你的“等待”标准应该自动处理。

    但是,如果您要读取行然后解析代码行,则需要两个循环:

    int main(int argc, char *argv[])
    {
        /* initial parameter/buffer setup goes here */
    
        while (fgets(buffer, bufferlen, stdin)) {
            for (c = buffer; *c != '\0' && *c != terminatingcode; c++) {
                /* calculations go here! ... they sure do! </homer> */
            }
            if (*c == terminatingcode || ferror(stdin))
               break;
        }
    }
    

    请注意 fgets() 可能出于完全无辜的原因在这里“失败”,您需要熟悉 feof() 和 ferror() 以确保正确使用接口;我不确定我在上面代码中的使用是否与您想要/需要代码执行的操作一致。

    【讨论】:

    • 这正是我想要的!感谢你的回答;无论如何我可以为标准输入块计时吗?比如:数据 0 -> 20sec -> 数据 1 -> 16.2sec ->...
    • 确定;您可以熟悉 gettimeofday(2) 和朋友,并开始从您获得的 timeval 结构中减去秒/微秒。
    猜你喜欢
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 2017-02-15
    • 2017-07-07
    • 1970-01-01
    相关资源
    最近更新 更多