2014-10-18 13 views
1

我有以下的簡單的程序,catenates infile中到outfileÇDUP2覆蓋文件錯誤時線> 1

char *execArgs[] = { "cat", NULL}; 
    int outfile = open("outfile", O_WRONLY | O_CREAT, 0644); 
    int infile = open("infile", O_RDONLY, 0); 
    dup2(outfile, STDOUT_FILENO); 
    dup2(infile, STDIN_FILENO); 
    close(outfile); 
    close(infile); 
    execvp(execArgs[0], execArgs); 

現在,假設infile中的含量爲

this is infile 

和OUTFILE是

this is outfile 

運行該程序後,outfile的內容在最後有一個額外的「e」,如

this is infilee 

而且,如果OUTFILE反而

this is outfile 
this is outfile 

它成爲

this is infilee 
this is outfile 

有什麼不對?

+0

int outfile = open(「outfile」,O_WRONLY | O_CREAT,0644);這一行導致問題,你只想創建outfile文件不存在的情況。 – user3629249 2014-10-19 01:09:38

回答

1

您正在經歷的是預期的行爲。 cat只是寫入它讀取的字節數,所以由於原始outfile較長,其餘字節包含之前包含的內容。

如果你問你爲什麼從使用shell執行得到不同的行爲:

cat <infile> outfile 

的原因是,外殼打開outfile(或>任何目標)與O_TRUNC,這截斷文件作爲打開它的一部分,長度爲零。您可以通過將| O_TRUNC添加到您的open調用標誌參數中來獲得相同的行爲。

0

嘗試使用O_TRUNC這會截斷它存在的文件。

int outfile = open("outfile", O_WRONLY | O_CREAT | O_TRUNC, 0644); 
0

它不具有額外 E,它具有相同的E它總是在那個位置。

看你寫的字符串:

this is infilee 
this is outfile 
      ^
       +-- lines up 

的問題是,輸出不會被截斷,因此它保留了所有的舊內容。你只是從頭開始覆蓋它。