C ++:读取和排序二进制文件

时间:2013-06-02 02:53:48

标签: c++ sorting binary

我一直在挠头,把这个功课关了几天,但现在我蹲下来试着这样做,我就空了。我需要做4件事。

1)读取二进制文件并将该数据放入数组

2)根据从最低到最高的测试分数对列表进行排序

3)平均得分并输出

4)使用排序数据

创建一个新的二进制文件

这是二进制数据文件看起来未排序的

一个。史密斯89

吨。菲利普95

S上。长76

我可能会排序,因为我认为我知道如何使用并行数组和索引排序来解决它,但是读取二进制文件并将数据放入数组会让我感到困惑,因为我的书并没有。真的很好解释。

到目前为止,这是我的初步代码,它并没有真正起作用:

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <Windows.h>
using namespace std;



int get_int(int default_value);
int average(int x, int y, int z);

int main() 

   {


    char filename[MAX_PATH + 1];
    int n = 0;
    char name[3];
    int grade[3];
    int recsize = sizeof(name) + sizeof(int);
    cout << "Enter directory and file name of the binary file you want to open: ";
    cin.getline(filename, MAX_PATH);    

    // Open file for binary write.
    fstream fbin(filename, ios::binary | ios::in);
    if (!fbin) {
    cout << "Could not open " << filename << endl;
    system("PAUSE");
    return -1;
   }

}

抱歉这样的新手问题。

编辑:对不起前面说的数据文件应该是什么样子,二进制文件是一个.dat,当用记事本打开时会有这个文件:

A.PmithÌÌÌPh Ph Ph Ph Long Long Long ip ip J. J. J. J. J. J. J. J. J. J. White <

3 个答案:

答案 0 :(得分:2)

用c ++读取文件很简单:

从文件创建一个流[以便从流中读取](你有文件流[输入/输出],字符串流......)

    ifstream fin;  //creates a fileinput stream

    fin.open(fname.c_str(),ifstream::binary);        // this opens the file in binary mod  


    void readFile(string fname)
    {
        ifstream fin;
        fin.open(fname.c_str());            //opens that file;
        if(!fin)
            cout<<"err";
        string line;
        while(getline(fin,line))            //gets a line from stream and put it in line (string)
        {
            cout<<line<<endl;
            //reading every line
            //process for you need.
            ...
        }
        fin.close();
    }

如您所指定,该文件只是一个文本文件,因此您可以处理每一行并执行您想要的任何操作。

答案 1 :(得分:1)

从二进制文件中读取可能看起来令人困惑,但它确实相对简单。您已使用文件名声明了您的fstream并将其设置为二进制,这几乎没有什么可做的。

创建指向字符数组的指针(通常称为缓冲区,因为此数据通常在用于其他目的后从此数组中提取)。数组的大小由文件的长度决定,您可以使用以下方法获得:

fbin.seekg(0, fbin.end); //Tells fbin to seek to 0 entries from the end of the stream
int binaryLength = fbin.tellg(); //The position of the stream (i.e. its length) is stored in binaryLength
fbin.seekg(0, fbin.beg); //Returns fbin to the beginning of the stream

然后,这用于创建一个简单的字符数组指针:

char* buffer = new char[binaryLength];

然后将数据读入缓冲区:

fbin.read(buffer, binaryLength);

文件中的所有二进制数据现在都在缓冲区中。这些数据可以像普通数组一样非常简单地访问,并且可以随意使用。

但是,您拥有的数据根本不是二进制数据。它看起来更像是一个普通的文本文件。也许,除非明确说明,否则您应该考虑使用不同的方法来读取数据。

答案 2 :(得分:1)

您知道,通过低范围的排序索引,您可以避免实际排序(比较索引和前后移动数据)。您所要做的就是分配vector vector strings,将其大小调整为101.然后遍历数据,存储每个:“A. Smith”,第89个元素; “T. Phillip”在第95位; 76岁的“S. Long”依此类推。

然后通过迭代从begin()end()的向量元素,您将已经对所有数据进行了排序。

这几乎是线性复杂性(几乎,因为子向量和字符串的分配/调整可能很昂贵)容易和透明。