在C中打开文件并覆盖(如果存在)

时间:2018-06-09 01:56:53

标签: c

我正在研究一个C程序。我无法打开文件并覆盖它是否存在。我认为代码是正确的,而是附加代码。

int in, out, append ,pid;
if (sc->infile)
{
    in = 1;
    printf("infile");
}
if (sc->outfile){
    out = 1;
    printf("outfile");
}
if (sc->append)
    append = 1;


if ((pid = fork()) < 0)
    perror("some erro");
else if (pid == 0)
{
    /* Be childish */
    if (in)
    {

        int fd0 = open(sc->infile, O_RDONLY);
        dup2(fd0, STDIN_FILENO);
        close(fd0);
    }

    if (out)
    {
        printf("outfile detece");
        int fd1;
        if (append)
             fd1 = open(sc->outfile, O_WRONLY | O_CREAT | O_APPEND, 0666);
        else

            fd1 = open(sc->outfile, O_WRONLY | O_CREAT , 0666);;
        dup2(fd1, STDOUT_FILENO);
        close(fd1);
    }

    execvp(sc->argv[sc->cmdStart[0]], &(sc->argv[sc->cmdStart[0]])); 
        fprintf(stderr, "Failed to exec\n" );
    exit(1);
}
else
{
/* Be parental */
    wait(0);
}

有人可以帮忙吗?我已经尝试了很多来解决这个问题。

2 个答案:

答案 0 :(得分:1)

声明

outputFd = open(sc->outfile, O_WRONLY | O_CREAT , 0666);

似乎正确,只需确保sc->outfile正确无误。您是否打印了open()perror("open()")所说的返回值。

来自open

的手册页
  

返回值

     

open()和creat()返回新的文件描述符,如果出错则返回-1   发生了(在这种情况下,errno设置得恰当)。

同时打印errno。例如

int outputFd;
outputFd = open(sc->outfile, O_WRONLY | O_CREAT , 0666);
if(outputFd == -1) {
    /* Error handling */
}

它是否会附加?不,您提到的代码快照无法实现。如果您可以使用O_APPEND

答案 1 :(得分:1)

inoutappend未初始化为零,因此会导致问题。

将申报行更改为

int in = 0, out = 0, append = 0, pid;