在C中使用内存映射来读取二进制文件

时间:2012-04-15 05:24:53

标签: c binaryfiles mmap

我正在尝试从非常大的二进制文件中读取数据并使用内存映射来处理它,因此可以逐字节读取它。我这样做时会遇到一些编译器错误,我无法弄清楚导致它们的原因。我在Linux平台上这样做,以备记录。

#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

我做错了什么,我该怎么做才能解决它?

1 个答案:

答案 0 :(得分:1)

有几个错误,如果这确实是整个代码失败的话:

  1. O_RDONLY需要包含fcntl.h
  2. 代码是在任何函数之外定义的。
  3. mmap的第一个参数是void *,因此只需使用NULL
  4. pagesize未声明。
  5. 以下编译:

    #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);
    }