C++慢读/搜索

mag*_*gu_ 4 c++ file seekg

在我的程序中,我读了一个文件(这里只有一个大约200k数据点的测试文件,之后会有数百万.)现在我做的是:

for (int i=0;i<n;i++) {
    fid.seekg(4,ios_base::cur);
    fid.read((char*) &x[i],8);
    fid.seekg(8,ios_base::cur);
    fid.read((char*) &y[i],8);
    fid.seekg(8,ios_base::cur);
    fid.read((char*) &z[i],8);
    fid.read((char*) &d[i],8);
    d[i] = (d[i] - p)/p;
    z[i] *= cc;
}
Run Code Online (Sandbox Code Playgroud)

其中n表示要读入的点数.

之后我又用它们写了

for(int i=0;i<n;i++){
        fid.write((char*) &d[i],8);
        fid.write((char*) &z[i],8);

        temp = (d[i] + 1) * p;
        fid.write((char*) &temp,8);
    }
Run Code Online (Sandbox Code Playgroud)

因此写作比读数快.(用clock_t测量的时间)

我的问题现在.我是否在阅读中做了一些相当愚蠢的错误,或者可以预期这种行为?

我正在使用带有磁力驱动器的Win XP.

你的magu_

huy*_*itw 13

seekg经常使用.我看到你用它来跳过字节,但你也可以读完整个缓冲区,然后跳过缓冲区中的字节:

char buffer[52];

for (int i=0;i<n;i++) {
    fid.read(buffer, sizeof(buffer));
    memcpy(&x[i], &buffer[4], sizeof(x[i]));
    memcpy(&y[i], &buffer[20], sizeof(y[i]));
    // etc
}
Run Code Online (Sandbox Code Playgroud)

但是,您可以定义表示文件中数据的结构:

#pragma pack(push, 1)
struct Item
{
    char dummy1[4]; // skip 4 bytes
    __int64 x;
    char dummy2[8]; // skip 8 bytes
    __int64 y;
    char dummy3[8]; // skip 8 bytes
    __int64 z;
    __int64 d;
};
#pragma pack(pop)
Run Code Online (Sandbox Code Playgroud)

然后声明这些结构的数组并一次读取所有数据:

Item* items = new Item[n];
fid.read(items, n * sizeof(Item)); // read all data at once will be amazing fast
Run Code Online (Sandbox Code Playgroud)

(注:我不知道类型的x,y,zd,所以我想__int64在这里)