繁体   English   中英

如何从 stdin 读取到 16 字节组中的新行?

[英]How can I read from stdin until new line in groups of 16 bytes?

我需要一个代码来使用 function 从 stdin 读取直到有一个换行符,然后使用该行。 问题是我不能只读取字符并将它们放入数组中,直到我读取“\n”,因为练习需要一次最多读取 16 个字节。

我尝试使用 function strtok 来使用分隔符“\n”来划分行,但它没有按我想要的那样工作,所以有没有什么方法只能读取直到它检测到“\n”? 我也需要它不断地阅读它。

这是我现在拥有的:

void readline(char *buf, unsigned buf_size){
    ssize_t num_read;
    while((num_read = read(STDIN_FILENO,buf,buf_size)) > 0){
    }
}

然后在主function:

while(i == 0){ 
    readline(buf,BUF_SIZE);
    token1 = strtok(buf,"\n");
    while(token1 != NULL){
        orden->num=0;
        token2 = strtok(token1, " ");
        orden->args[orden->num] = token2;
        while(token2 != NULL){
            if(token2!=NULL) {
                orden->num+=1;
                orden->args[orden->num] = token2;
            }
        }
        orden->num+=1;
        orden->args[orden->num] = NULL;
        insertar_final(lista,orden);
        token1 = strtok(NULL,"\n");
    };
...

其他使用“”的 strtoks 声明用于我的代码需要的其他东西,但那是有效的,所以不要介意它们。

从您的代码中,忘记 16 字节的东西。

您只是想存储一组由空格分隔的单词(例如空格和/或换行符)。 单词可能 [最多] 16 个字节,但这并不重要。

使用fgets 不会去除换行符。

您的问题是缓冲区在每一行上重复使用。 因此(例如),在读取的第二行中,它会覆盖第一行中的单词。

您需要使用strdup来保存每个令牌的唯一副本。

改变:

orden->args[orden->num] = token2;

进入:

orden->args[orden->num] = strdup(token2);

这是一些重构代码:

char buf[128 + 1];

while (fgets(buf,sizeof(buf),stdin) != NULL) {
    // save off all whitespace separated tokens
    char *tok = strtok(buf," \n");
    while (tok != NULL) {
        orden->args[orden->num++] = strdup(tok);
        tok = strtok(NULL," \n");
    }

    // add NULL terminator
    orden->args[orden->num] = NULL;

    // add line to list of lines
    insertar_final(lista,orden);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM