2013-06-02 3 views
1

Я почесываю голову и откладываю эту домашнюю работу на пару дней, но теперь, когда я сижу, чтобы попытаться сделать это, я прихожу пустым. Мне нужно 4 вещи.C++: чтение и сортировка двоичных файлов

1) Читать бинарный файл и поместить эти данные в массивы

2) Сортировка списка в соответствии с результатами тестов от самого низкого до самого высокого

3) Средних баллов и выходного сигнал

4) Создайте новый двоичный файл с отсортированными данными

Это то, что выглядит двоичный файл данных несортированный

A. Smith 89

Т. Phillip 95

S. Long 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, который имеет это в нем при открытии с помощью блокнота:

ÌÌÌÌÌÌÌÌÌÌÌY Т. А. Смит Phillip ÌÌÌÌÌÌÌÌ_ S Long ip ÌÌÌÌÌÌÌÌL J. White p ÌÌÌÌÌÌÌÌd

+1

Вопрос? какой вопрос? Это больше похоже на отчет о состоянии. –

+0

Это не «двоичный файл». Это текстовый файл из того, что вы разместили. Что заставляет вас думать, что это двоично? Я тоже не вижу здесь вопроса. –

+0

Почему вы ссылаетесь на него как на двоичный файл? Он выглядит как текстовый файл. Текстовый файл имеет строки, и его удобно читать по очереди. Попытайтесь развязать себя, читая его по очереди и выведите результат. –

ответ

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); 

Все двоичные данные, которые были в файле, теперь находятся в буфере. К этим данным можно обращаться очень просто, как в обычном массиве, и их можно использовать, как вам угодно.

Данные, которые у вас есть, однако, не кажутся двоичными. Он больше похож на обычный текстовый файл. Возможно, если не указано явно, вы должны рассмотреть другой метод для чтения ваших данных.

+0

Я имею в виду способ, которым я теперь он должен выглядеть так, как надо читать, иначе двоичный файл выглядит так: A.Smith ÌÌÌÌÌÌÌÌÌÌÌY T. Phillip ÌÌÌÌÌÌÌÌ_ S. Long ip ÌÌÌÌÌÌÌÌL J. White p ÌÌÌÌÌÌÌÌd – user2444400

+0

Как только эти относительно неясные данные загружаются в буфер через двоичное чтение вы можете легко преобразовать его в форму, которую вы указали в своем сообщении. – Oracular

2

Чтение файла в C++ проста:

создать поток из файла [так, что для чтения из потока] (у вас есть FILESTREAM [вход/выход], stringstream ...)

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

Вы знаете, что с этим низким диапазоном индекса сортировки вы можете избежать фактической сортировки (при сравнении индексов и перемещения данных вперед и назад). Все, что вам нужно сделать, это выделить vector из vector из strings, изменить его размер до 101. Затем переместите данные, сохраняя каждый: «A. Smith» в 89-ом элементе; «Т. Филипп» в 95-м; «С. Лонг» в 76-м и т. Д.

Затем, итерируя векторные элементы от begin() до end(), у вас есть все данные, которые уже отсортированы.

Это почти линейная сложность (почти потому, что распределение/изменение размеров подвекторов и строк может быть дорогостоящим) простым и прозрачным.

Смежные вопросы