gpt4 book ai didi

c - 将标准输入重定向到文件

转载 作者:太空宇宙 更新时间:2023-11-04 03:19:38 27 4
gpt4 key购买 nike

我想编写一个程序,将我在终端中输入的任何内容写入文件。这是我编写的代码。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int fd[2];
void pri(){
char a[10];
int ad=open("t.txt",O_CREAT | O_APPEND | O_NONBLOCK | O_RDWR, 0644);
if(read(fd[0],a,10)>0){
write(ad,a,10);
}
}
int main()
{
int a;
char s[10];
pipe(fd);
while(read(0,s,10)>0){
write(fd[1],s,10);
pri();
}
return 0;
}

目前我正在使用数组和管道来实现这一点。有没有什么方法可以在不使用任何数组的情况下实现相同的效果?

最佳答案

I want to write a program that takes whatever I type in terminal and writes it to file.

这实际上非常简单,您不需要为此使用管道。 (您的应用程序本身承担了管道的角色。)

这就是我所做的演示:mycat.c

#include <stdio.h>

int main(int argc, char **argv)
{
if (argc < 2) {
fprintf(stderr, "ERROR: No output file!\n");
fprintf(stderr, "Usage: mycat FILE\n");
return 1;
}
FILE *fOut = fopen(argv[1], "w");
if (!fOut) {
fprintf(stderr, "ERROR: Cannot open file '%s' for writing!", argv[1]);
}
int c;
while ((c = getc(stdin)) >= 0) {
if (putc(c, fOut) < 0) {
fprintf(stderr, "ERROR: Cannot write to file '%s'!", argv[1]);
}
}
if (fclose(fOut)) {
fprintf(stderr, "ERROR: Cannot write to file '%s'!", argv[1]);
}
return 0;
}

它从stdin中读取一个字符并将其写入文件流 fOutfopen() 打开前。重复此操作直到 getc()可能发生的失败,例如由于输入结束。

Cygwin/Windows 10 上的 bash 示例 session :

$ gcc --version
gcc (GCC) 6.4.0

$ gcc -std=c11 -o mycat mycat.c

$ ./mycat
ERROR: No output file!
Usage: mycat FILE

$ ./mycat mycat.txt
Hello World.
tip tip tip

此时,我输入了 Ctrl+D 以发出信号 bash输入结束。

$ cat mycat.txt
Hello World.
tip tip tip

$

我用了cat输出mycat.txt的内容.这是之前输入的内容(如预期的那样)。

cat当我读到这个问题时实际上是我的第一个想法但后来我想:这是一个标记为 的问题(不是 )。因此我的 C 示例代码。

为了完整性,与cat相同:

$ cat >mycat.txt <<'EOF'
> Hello cat.
> key key key
> EOF

$ cat mycat.txt
Hello cat.
key key key

$

这让我想起了 <<'EOF'是由 bash 解释的东西.因此,以下也适用:

$ ./mycat mycat.txt <<'EOF'
Hello World.
tip tip tip
EOF

$ cat mycat.txt
Hello World.
tip tip tip

$

这让我相信cat工作方式非常相似,尽管它将输入文件作为参数并写入 stdout (在 shell 中调用它时可能会被重定向)。反对我的,cat如果没有提供参数也不会失败——它从 stdin 读取相反。

关于c - 将标准输入重定向到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47690102/

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