2012-04-15 113 views
0

我想從一個非常大的二進制文件讀取數據並使用內存映射進行處理,因此可以逐字節讀取它。這樣做時我收到了一些編譯器錯誤,我無法弄清楚是什麼導致了它們。我正在Linux平臺上做這個記錄。是在C中使用內存映射讀取二進制文件

#include <unistd.h> 
#include <sys/types.h> 
#include <sys/mman.h> 
#include<stdio.h> 
#include<stdlib.h> 
int fd; 
char *data; 

fd = open("data.bin", O_RDONLY); 
pagesize = 4000; 
data = mmap((caddr_t)0, pagesize, PROT_READ, MAP_SHARED, fd, pagesize); 

我得到的錯誤如下:

CADDR未初始化

R_RDONLY未初始化

MMAP太少參數。

我使用一個Makefile來編譯它,它看起來像這樣:

all: order_book 
CC = gcc 
CFLAGS = -std=c99 

order_book: main.c 
    $(CC) $(CFLAGS) -o order_book main.c 
clean: 
    rm -f order_book 

我在做什麼錯了,我能做些什麼來解決這個問題?

+0

它看起來像你需要包含另一頭文件。也許'stdio.h'或'stdlib.h'? – 2012-04-15 05:31:14

+0

我已經擁有了它們。忘記在問題中提及它們 – AndroidDev93 2012-04-15 05:35:10

+0

失敗的代碼與上面的完全相同。我使用makefile來編譯我的程序。我在上面的問題框 – AndroidDev93 2012-04-15 05:45:01

回答

1

若干誤差,如果這確實是整個一段代碼失敗:

  1. O_RDONLY要求fcntl.h被包括在內。
  2. 該代碼是在任何函數之外定義的。
  3. mmap的第一個參數是void *,所以只需使用NULL
  4. pagesize未被聲明。

下編譯:

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

int fd; 
char *data; 

void main(int argc, char *argv[]) { 
    fd = open("data.bin", O_RDONLY); 
    int pagesize = 4000; 
    data = mmap(NULL, pagesize, PROT_READ, MAP_SHARED, fd, pagesize); 
} 
+0

感謝您解決這個問題!現在當我嘗試訪問數據[0]時,它給了我一個段錯誤。我是否需要做其他事情,以便將文件的數據複製到char指針數據中? – AndroidDev93 2012-04-15 06:07:13

+0

您需要檢查所有返回碼(來自'open','mmap'和任何其他函數調用),以確保它們成功。查看http://linux.die.net/man/2/mmap的'mmap'手冊頁獲取完整的示例。 – 2012-04-15 06:15:12