gpt4 book ai didi

c - 将标准输入重定向到简单 C 行阅读器应用程序的 csh 脚本时出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 08:56:11 24 4
gpt4 key购买 nike

我需要在 Solaris 上编写 Solaris the '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

最佳答案

stdin 已缓冲,这可能是文本文件中的某些行被遗漏 的原因。您可以使用 setvbuf(fd, NULL, _IONBF, 0)equivalent 使 stdin 无缓冲在 fgets 调用您的 C 程序之前解决此问题。
或者,您可以按照 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;
}

希望这对您有所帮助!

关于c - 将标准输入重定向到简单 C 行阅读器应用程序的 csh 脚本时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16901171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com