我一直在挠头,把这个功课关了几天,但现在我蹲下来试着这样做,我就空了。我需要做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 <答案 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()
的向量元素,您将已经对所有数据进行了排序。
这几乎是线性复杂性(几乎,因为子向量和字符串的分配/调整可能很昂贵)容易和透明。