簡體   English   中英

C 系統調用 open()

[英]C system calls open()

我在使用open()時遇到問題。 它總是返回-1 ,我不知道代碼有什么問題。 它一直在說:

 r1: No such file or directory

但txt文件與C程序在同一目錄下。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

#define BUFFSIZE 256

char upper(char c);

int main(void){

    int fd1, read1, fd2, write2;
    char *buffer[BUFFSIZE];

    fd1 = open("minuscole.txt", O_RDONLY);
    if (fd1 < 0) { perror("r1"); exit(1); }
    read1 = read(fd1, buffer, BUFFSIZE);
    close(fd1);

    printf("%d", read1);
    if(fd2 = open("maiuscole.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644) > 0){
        write2 = write(fd2, buffer, BUFFSIZE);
    }
    close(fd2);

    return 0;
}

我希望它創建一個名為: "maiuscole.txt"的文件並寫下其中的內容: "minuscole.txt"

盡管您說您的輸入文件與源文件位於同一位置,但這並不意味着您也在同一位置運行可執行文件。 錯誤消息清楚地表明您不是。

要修復,請確定您從哪個目錄運行可執行文件,確保您的輸入文件位於那里,並且您有權在其中創建 output 文件。

如評論中所述,您對fd2的賦值語句不正確,因為賦值運算符的優先級低於比較運算符。 為了保持一致性,我建議您更改代碼以匹配fd1使用的樣式。 請注意, 0也是有效的文件描述符。

fd2 = open("maiuscole.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if(fd2 >= 0){
    //...

readwrite的第二個參數分別采用void * / const void * ,因此它掩蓋了您將char *[] (衰減為char ** )傳遞給這些函數的錯誤。 這不是您的意圖,因為char **只能存儲sizeof(char *)字節。 您打算存儲最多BUFFERSIZE字節。 buffer更改為char數組而不是char *數組。

char buffer[BUFFSIZE];

從輸入文件中讀取數據后, read調用的返回值是讀取了多少字節。 您應該只將那么多字節寫入 output 文件,而不是整個緩沖區。

    write2 = write(fd2, buffer, read1);

如果只讀取了 10 個字節,則緩沖區中前 10 個字節之后的字節未初始化,您不應將它們寫入 output。

還有其他情況和錯誤檢查供您考慮。 我不會提供所有解決方案,但您應該考慮到:

  • 您的輸入文件可能大於BUFFSIZE
  • 即使文件大於BUFFSIZE ,對read的調用也可能返回小於BUFFSIZE
  • write的調用可能返回小於read1

最后,關於close的說明。 忽略close的返回值的並不孤單,即使在生產代碼中也是很常見的事情。 但是,檢查close是否成功仍然是一個好習慣。 在某些情況下,它可能會失敗,因為描述符之前已經關閉。 您可能想知道是否會發生這種情況,因為它表明程序中存在某種邏輯錯誤。 雖然關閉無效的文件描述符是良性的,但在未來,您可能會意外關閉程序的其他部分正在使用的文件描述符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM