gpt4 book ai didi

c - 将标准输出重定向到文件 - 在 C 中

转载 作者:行者123 更新时间:2023-11-30 16:40:35 25 4
gpt4 key购买 nike

我一直在尝试将输出重定向到文件并使用函数从文件而不是标准输入中读取,但它似乎不像我重定向到文件并检查文件是否已被读取那样工作。使用输出创建的内容中什么也没有。这个函数可能有什么问题。

 /* Redirect a standard I/O file descriptor to a file
* Arguments: filename the file to/from which the standard I/O file
* descriptor should be redirected
* flags indicates whether the file should be opened for reading
* or writing
* destfd the standard I/O file descriptor which shall be
* redirected
* Returns: -1 on error, else destfd
*/
int redirect(char *filename, int flags, int destfd){

int ret;

if(flags == 0){
destfd = open(filename,O_RDONLY);

if (destfd < 0){
return -1;
}
ret = dup2(0,destfd);

if(ret < 0){
return -1;
}
close(destfd);
}

if(flags == 1){
destfd = open(filename,O_APPEND|O_WRONLY);

if (destfd < 0){
return -1;
}

ret = dup2(destfd,1);

if(ret < 0){
return -1;
}
close(destfd);
}
return destfd;
}

最佳答案

您的代码存在几个问题,尤其是非常糟糕的格式,这使得代码很难阅读。

例如,对 dup2 的调用是向后的 - 它用 stdin 的副本替换最近打开的 destfd

ret = dup2(0,destfd);

几行后,您关闭 destfd

了解 elseelse if 可以让您的 if 语句受益

if(flags == 0) {
// code
} else if(flags == 1) {
// code
}

实际上,您可以通过将 flags 参数视为传递给 open 并具有 destfd 的相同标志来简化整个函数作为您要替换的文件描述符。

int redirect(char *filename,int flags, int destfd)
{
int fd;

fd=open(filename,flags,S_IRUSR|S_IWUSR);
if(fd!=-1)
{
if(dup2(fd,destfd)==-1)
{
close(fd);
fd=-1;
}
else
{
close(fd);
}
}
return fd;
}

然后你可以这样调用它

redirect("output.txt",O_CREAT|O_WRONLY,1); // Redirect stdout
redirect("input.txt",O_RDONLY,0); // Redirect stdin

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

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