ファイルポインタの操作

filepointer.png

ファイルを読みたいんじゃない、
ちょっと読み飛ばしたいだけ!
そんなあなたに

C++ C WinAPI C# Python Java
(ファイルの先頭) ios::beg SEEK_SET FILE_BEGIN  SeekOrigin.Begin 0
(ファイルの現在位置) ios::cur SEEK_CUR FILE_CURRENT SeekOrigin.Current 1 randomAccessFile.seek(file.length())
(ファイルの終端) ios::end SEEK_END FILE_END  SeekOrigin.End 2

ポインタを移動させる

C++ ifs.seekg(bytes,ios::end)
C fseek(fp,0,SEEK_END);
WinAPI SetFilePointer(HANDLE,0,NULL,FILE_END);
C# fs.Seek(バイト数,SeekOrigin.End)
python f.seek(バイト数,どこから)
Java randomAccessFile.seek(バイト数)

現在のポインタの位置を知る

C++ C python
is.tellg(); ftell(fp); tell()

ply方式のファイルで、
ヘッダの終わりには
「end_header\n」と書いてあるとする。

FILE* fp;
    fp=fopen("bunny/bun_zipper_res4.ply","rb");
    if(fp==NULL){
        printf("file not found\n");
    }
    //ファイルの長さを調べる
    fseek(fp,0,SEEK_END);//ファイル終端から+0ファイルポインタの位置を移動させる
    int filebytes=ftell(fp);//現在のファイルポインタの位置を返す
    char* buf=new char[filebytes+1];//最後に終端文字'\0'を入れるため+1にする。、
    rewind(fp);//先頭に戻る
    fread(buf,sizeof(char),filebytes,fp);
    buf[filebytes]='\0';
    printf("ファイルの長さ%dバイト\n",filebytes);
    char* end_header=NULL;//初期化
    //end_headerが出てくるまで続ける。
    while(end_header==NULL){
        fgets(buf,filebytes,fp);//1行読む。
        end_header=strstr(buf,"end_header");
}

このbeginからが頂点データの始まりになる。

ファイルの終わりまで読む

コードの短さではpythonの勝ち!
template <typename T>
    bool ReadFileToTheEnd(const char* _filename,T** _dst){
        HANDLE handle;
        DWORD dwnumread;
        handle = CreateFile(_filename, GENERIC_READ,FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL );
        if(handle==INVALID_HANDLE_VALUE){assert(!"ファイルが存在しません。");return false;}
        DWORD high;
        DWORD low=GetFileSize(handle,&high);
        *_dst=new T[low/sizeof(T)];
        ReadFile(handle,*_dst,low,&dwnumread ,NULL);
        CloseHandle(handle);
        return true;
    }

DWORD low=GetFileSize(handle,DWORD high);

でファイルサイズを予め知ることができる。便利!!
よっぽど大きなファイルで無い限り、lowにファイルサイズが入る。
DWORDに入りきらないほどファイルサイズが大きい場合、のこりの情報がhighに入る
setEndOfFile(HANDLE hFile);
SetFilePointer(HANDLE,0,NULL,FILE_END);

サポートサイト Wikidot.com