2012-02-09 107 views
1

我創建了一個快速程序來簡單地獲取文件的內容並將它們轉換爲輸出文件。我第一次運行我的程序時,我沒有遇到任何錯誤,看起來好像一切都會正常工作。但是,當我檢查我的輸出文件時,文件中沒有任何內容。我的第一個想法是,權限不正確,不允許寫作。當我在目錄中手動創建一個.txt文件並設置權限,然後運行程序時,它似乎工作(Ubuntu顯示文件的內容,副本),但我無法打開實際的文件。 希望有比我更有經驗的人可以幫助我。 那麼這裏是我的代碼:使用read(),write(),open()將文件的內容複製到另一個文件

int main(int argc, char* argv[]){ 
    char buf[128]; 
    int outft, inft,fileread; 
    // output file opened or created 
    if((outft = open(argv[1], O_CREAT | O_APPEND | O_RDWR))==-1){ 
    perror("open"); 
    } 
    // lets open the input file 
    inft = open(argv[2], O_RDONLY); 
    if(inft >0){ // there are things to read from the input 
    fileread = read(inft, buf, 160); 
    printf("%s\n", buf); 
    write(outft, buf, 160); 
    close(inft); 
    } 
    close(outft); 
    return 0; 
} 
+2

你讀160個字節到128字節的緩衝區? – 2012-02-09 21:33:51

+0

如果輸入文件的打開失敗,則不會報告。 'read()'和'write()'的返回值也被取消選中。 – hmjd 2012-02-09 21:34:39

+0

@ paulsm4對權限是正確的 - 當使用'open_()'使用'O_CREAT'時,它們是必需的。如果我運行這段代碼(修復了緩衝區溢出),我會在新文件上獲得文件權限的隨機垃圾。 – Dmitri 2012-02-10 00:44:13

回答

2

你的數據緩衝區的大小是128個字節,但你讀160個字節的數據到它。這意味着你正在寫入聲明緩衝區之外的內存。

我預計變量outft, inft, and fileread可能在內存中跟着buf,並且在read()調用期間被垃圾覆蓋。對write()的調用可能會失敗,因爲它正在爲文件描述符寫入一個垃圾值。

爲了避免緩衝區溢出,sizeof是你的朋友:

fileread = read(inft, buf, sizeof(buf)); 
... 
write(outft, buf, fileread); 
+0

是啊,算出來,並意識到這是一個錯誤如何derp。 – 2012-02-09 22:22:26

3

一定要設置文件權限。

例:

if((outft = open(argv[1], O_CREAT | O_APPEND | O_RDWR, 0666))==-1){ 
    perror("open"); 
    } 
相關問題