0

我需要在 Solaris 上编写 Solaris 'line' 应用程序,这非常简单,在 Linux 上。它是为脚本开发的,它需要一行标准输入并将其输出到标准输出。为此,我编写了一个非常简单的 C 程序。我使用了两者getlinefgets并且它们产生了相同的结果:

int main(int argc, char* argv[])
{
    char buf[256];
    char* line = NULL;

    if (fgets(line, 256, stdin) != NULL)
    //if (getline(&line, &len, stdin) != -1)
    {
        printf("%s", line);
    }
    return EXIT_SUCCESS;
}

C-Shell 脚本loop_file如下所示:

#!/bin/csh -f
while(1)
    set line = `app`
    echo "Got Line : $line"
end

我使用以下方法开始该过程: ./loop_file < textFile.txt

这是一个大文件,第一行只是打印出来,但下一行几乎是 4096 个字符,第三行之后几乎是 4096 个字符,依此类推。这不是逐行读取。我什至尝试忘记使用 C 并在 while 循环中使用 awk。

有任何想法吗?

顺便说一句,不要说 - 不要使用 CSH - 这是我需要移植的遗留代码 :)

while(1)
set line = `app`

    set name = $line[0];
    set address = $line[1];
    set purpose = $line[2];
end
4

1 回答 1

2

stdin被缓冲,这可能是文本文件中的某些行被遗漏的原因。您可以在 C 程序中调用之前stdin使用无缓冲setvbuf(fd, NULL, _IONBF, 0)等效方法并解决此问题。 或者,您可以按照实用程序逐个字符地阅读。也许是这样的:fgets
line

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(void)
{
    char c;
    while(read(STDIN_FILENO , &c, 1) > 0 && c != '\n')
        putchar(c);
    return  EXIT_SUCCESS;
}

希望这可以帮助!

于 2013-06-03T17:46:07.140 回答