2010-11-06 293 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/mman.h> 
#include <sys/stat.h> 
#include <errno.h> 

int main(int argc, char *argv[]) 
{ 
    int fd, offset; 
    char *data; 
    struct stat sbuf; 
    int counter; 

    if (argc != 2) { 
     fprintf(stderr, "usage: mmapdemo offset\n"); 
     exit(1); 
    } 

    if ((fd = open("mmapdemo.c", O_RDONLY)) == -1) { 
     perror("open"); 
     exit(1); 
    } 

    if (stat("mmapdemo.c", &sbuf) == -1) { 
    perror("stat"); 
     exit(1); 
    } 

    offset = atoi(argv[1]); 
    if (offset < 0 || offset > sbuf.st_size-1) { 
     fprintf(stderr, "mmapdemo: offset must be in the range 0-%ld\n",sbuf.st_size-1); 
     exit(1); 
    } 

    data = mmap((caddr_t)0, sbuf.st_size, PROT_READ, MAP_SHARED, fd, 0); 

    if (data == (caddr_t)(-1)) { 
     perror("mmap"); 
     exit(1); 
    } 

    // print the while file byte by byte 

    while(counter<=sbuf.st_size) 
     printf("%c", data++); 

    return 0; 
} 

這給了我錯誤如下:C的printf編譯器警告

gcc mmapdemo.c -o mmapdemo 
mmapdemo.c: In function 'main': 
mmapdemo.c:48: warning: format '%c' expects type 'int', but argument 2 has type 'char *' 

請幫我解決這個問題。

+0

@約翰Kugelman:我希望我能給予好評的編輯。 – 2010-11-06 05:31:37

+1

近乎重複30分鐘前從同一作者:http://stackoverflow.com/questions/4111984/memory-mapping-using-c-programming – 2010-11-06 05:32:51

+1

下一次,只需搜索'printf',然後單擊該網站,說' printf C++參考「並尋找適當的標籤。然後,也許進一步去記住所有的標籤。 – 2010-11-06 05:36:27

回答

4
printf("%c", *data++); 

datachar *%c格式說明符告訴printf期望char。要從char *獲得char,您需要取消引用指針使用*運算符。

也就是說,您的程序仍然無法正常工作,因爲您的打印循環中沒有增加counter,也沒有初始化它。我會去:

for (size_t i = 0; i < sbuf.st_size; ++i) { 
    printf("%c", data[i]); 
} 

改爲。我沒有檢查過你的程序的其餘部分,但鑑於我看到的三行中有三個嚴重錯誤,我懷疑其餘部分沒有錯誤。

+0

什麼時候'++'綁定?解除引用之前或之後? – 2010-11-06 05:56:13

+0

@Christian Mann:之前。 Postfix運算符在C中的優先級最高。 – 2010-11-06 17:20:50

2

按字節打印出來字節,需要使用

printf("%c ", *data++) 

或打印出來的十六進制值:

printf("%02X", *data++); 
+0

'data'已經是'char *'。沒有必要進行明確的演員表演。 – 2010-11-06 05:40:47

+1

Arrrg我的眼睛!刪除無用和可怕的演員。 – 2010-11-06 05:41:34

+0

哈哈,沒有看到它 – 2010-11-06 05:46:46