2012-03-08 99 views
1

我不能爲我的生活記住如何做到這一點。這個程序打開一個文件然後讀取文件。我想要做的就是打印剛剛閱讀的內容。打印一個字符[]

int main(int argc, char *argv[]) 
{ 
    char memory[1000]; //declare memory buffer size 
    int fd = 0; 
    int count = 1000; 


    if ((fd = open(argv[1], O_RDONLY)) == -1) 
    { 
     fprintf(stderr, "Cannot open.\n"); 
     exit(1); 
    } 

    read(fd, memory, count); 

    //printf the buffered memory contents 

    return 0; 
} 

回答

8

printf接受%s格式打印C字符串。但是,默認情況下,它要求字符串具有null-terminator(0x0 ASCII碼)。如果您確信有人讀通過調用read,那麼你可以這樣做:

printf("%s\n", memory); 

但是,你不能確定。因爲您甚至不檢查讀取的字節數或錯誤代碼。 所以你必須先解決你的代碼。

一旦你完成檢查錯誤,並知道了多少字節讀取,你可以這樣做:

printf("%.*s\n", (int)bytes_that_were_read, memory); 

祝你好運!

+1

謝謝你,我不知道該怎麼辦! – 2012-03-08 13:31:33

+1

它不是'printf(「%。* s \ n」)'? – hmjd 2012-03-08 13:31:54

+0

@hmjd:對。糾正。謝謝! – 2012-03-08 13:32:21

0

您可以使用一個for循環和printf("%c", buffer[i])在一次打印一個字符,或者您可以使用printf("%s", buffer)如果緩衝區是空結尾的字符串。

0
for (unsigned int i = 0; i < count; i++) { 
    printf("%c", memory[i]); 
} 
0
  1. 將最後一個字符來\0內存
  2. 用printf()

或者讀取一個字符少,因爲最後一個,你需要將其設置爲\0

-1

如果該文件的文本文件,只需使用printf:

printf(memory); 

儘管你必須null來終止緩衝區。

+0

當心!切勿在沒有格式說明符的情況下printf()未知數據。想象一下,文件內容是'我是EVIL%s%s%s%s!' - 而不是文件數據,你會得到垃圾輸出或分段錯誤。 – 2012-03-08 21:35:49

1

出於某種原因,您是否必須堅持使用printf()?如果該文件與內部的某個地方的'\0'二進制文件相關?這將甚至打破printf("%.*s", ...)。如果你用read()閱讀,你應該可以用write()

while (bytes_written < bytes_read) 
{ 
    ssize_t x = write(STDOUT_FILENO, 
         memory + bytes_written, 
         bytes_read - bytes_written); 
    if (-1 == x) 
    { 
     exit(1); 
    } 
    bytes_written += x; 
}