星期日, 6月 08, 2008

seekg() and seekp() in C++

前幾天和efang討論一個問題,如何Random access a file,最主要要問題是能跳到檔案任一byte處進行寫檔和讀檔動作。我提出來的第一個解決方式,使用Unix System function即可搞定,對於unix而言,everything is a file,於是可以寫出這樣子的code

struct _bnode{  /* ... */  };

_bnode node;
int fd = open(filename.c_str(), O_RDONLY);
lseek(fd, index*sizeof(_bnode), SEEK_SET);
read(fd, &node, sizeof(_bnode));
close(fd);

write的code也差不多,我就不寫了,這樣子的確可以迅速的完成我想要的目的,不過efang問我,seekg和seekp呢? 好問題,我從來都不知道這兩個function(看來我熱愛C++的牌子可以收起來了XD),這兩個funtion也的確屬於C++ Standard,於是我又寫了測試碼如下

ifstream infile;
infile.open(filename.c_str(), ifstream::binary);
infile.seekg(index*sizeof(_bnode));
infile.read(static_cast<char*>(static_cast<void*>(&node)),
sizeof(_bnode));
infile.close();
infile.clear();

寫檔也一樣,只是把seekg改成seekp,也就不寫啦,其中inflie.read()是用了一點取巧的方法,因為C++是strong-type,所以得把_bnode*強制轉型成void*,才能再轉成read function protype的char*,這樣子對於讀取整個struct _bnode也方便的多。


---
看來efang比我更熱愛C++ XD



2008/06/17
In fact, it is not easy in random writing files. we can try to use the std::ofstream argument.

std::oftream outfile;
outfile.open(filename.c_str(), std::ios::in | std::ios::out | std::ios::binary);

It would avoid some problems.

張貼留言