2012-04-15 11 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'でしょうか? –

+0

私はすでにそれらを持っていた。 – AndroidDev93

+0

失敗したコードは上記とまったく同じです。私は私のプログラムをコンパイルするためにmakefileを使います。私は上記の質問ボックスに内容を表示しました – AndroidDev93

答えて

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]にアクセスしようとすると、それは私にsegfaultを与えます。ファイルのデータがcharポインタデータにコピーされるように何か他の処理をする必要がありますか? – AndroidDev93

+0

すべての戻りコード( 'open'、' mmap'、および他の関数呼び出しから)が成功したことを確認する必要があります。完全な例については、http://linux.die.net/man/2/mmapのmanapの 'mmap'を参照してください。 –

関連する問題