C++ 从缓冲区读取可变长度记录-奇怪的内存问题

C++ 从缓冲区读取可变长度记录-奇怪的内存问题,c++,records,fread,qsort,C++,Records,Fread,Qsort,我试图在一个非常大的数据集上实现一个I/o密集型快速排序(C++qsort)。为了提高速度,我希望一次将一块数据读入缓冲区,然后使用qsort在缓冲区内对其进行排序。(我目前正在处理文本文件,但希望很快转换为二进制文件。)但是,我的数据由可变长度的记录组成,为了排序,需要告知qsort记录的长度。有没有办法使之标准化?我能想到的唯一一件事是相当复杂的:我的程序当前从缓冲区读取数据,直到它碰到一个换行字符(ascii中的“10”),然后将每个字符转移到另一个数组。当它找到换行符(输入文件中的分隔符

我试图在一个非常大的数据集上实现一个I/o密集型快速排序(C++qsort)。为了提高速度,我希望一次将一块数据读入缓冲区,然后使用qsort在缓冲区内对其进行排序。(我目前正在处理文本文件,但希望很快转换为二进制文件。)但是,我的数据由可变长度的记录组成,为了排序,需要告知qsort记录的长度。有没有办法使之标准化?我能想到的唯一一件事是相当复杂的:我的程序当前从缓冲区读取数据,直到它碰到一个换行字符(ascii中的“10”),然后将每个字符转移到另一个数组。当它找到换行符(输入文件中的分隔符)时,它会用空字符填充该记录缓冲区中剩余的空格数(记录大小设置为30)。这样,我应该得到一个充满固定大小记录的缓冲区来进行qsort

我知道我的方法有几个问题,一个是它太笨拙,另一个是记录的大小可能会超过30,但通常要小得多。有更好的方法吗

同样,我当前的代码甚至不起作用。当我调试它时,它似乎在将字符从一个缓冲区传输到另一个缓冲区,但当我试图打印出缓冲区时,它只包含第一条记录

这是我的密码:

FILE *fp;
unsigned char *buff;
unsigned char *realbuff;
FILE *inputFiles[NUM_INPUT_FILES];
buff = (unsigned char *) malloc(2048);
realbuff = (unsigned char *) malloc(NUM_RECORDS * RECORD_SIZE);

fp = fopen("postings0.txt", "r");
if(fp)
{
    fread(buff, 1, 2048, fp);


    /*for(int i=0; i <30; i++)
     cout << buff[i] <<endl;*/

    int y=0;
    int recordcounter = 0;

    //cout << buff;
    for(int i=0;i <100; i++)
    {
        if(buff[i] != char(10))
        {
            realbuff[y] = buff[i];
            y++;
            recordcounter++;
        }        
        else
        {
            if(recordcounter < RECORD_SIZE)
                for(int j=recordcounter; j < RECORD_SIZE;j++)
                {
                    realbuff[y] = char(0);
                    y++;
                }
            recordcounter = 0;
        }
    } 

    cout << realbuff <<endl;   
    cout << buff;
}
else 
    cout << "sorry";
文件*fp;
未签名字符*buff;
无符号字符*realbuff;
文件*输入文件[NUM_INPUT_FILES];
buff=(无符号字符*)malloc(2048);
realbuff=(无符号字符*)malloc(NUM_记录*记录大小);
fp=fopen(“postings0.txt”,“r”);
if(fp)
{
fread(buff,12048,fp);

/*对于(int i=0;i,qsort函数只能在固定长度的记录上工作(如您所说)。为了对可变长度的记录进行排序,您需要一个指向它们的指针数组,然后让qsort对指针数组进行排序。这也可能更有效,因为指针的移动速度比大块数据快得多

std::sort也是如此,建议使用它,因为它是类型安全的。只需确保提供一个比较谓词(小于函数),将指针作为其参数作为第三个参数。

如何使用它来解析文件

签出此(网站名称很奇怪,无意冒犯!!)将记录返回为
然后你可以使用.< /p>如果你想让别人帮你,你就要更小心让你的代码可读。“代码”> QSoord在哪里?(BTW既然你已经使用C++为什么不使用<代码> STD::排序< /代码>?),你可能会写在“RealBuff'”上,因为“Y”永远不会重置。感谢您的建议。我创建了一个指针数组,并将它们指向每个记录的开头,但因为它们位于一个字符数组中,每个指针都指向从其指向的位置开始的整个数组。因此,当它排序时,我想打印出数组,它会将整个数组打印几次。如何才能我让每个指针只指向一条记录?同样,每个指针都指向一条记录的开头,但它认为缓冲区的其余部分也是它所指向的字符串的一部分。谢谢,bsg。