2013-02-27 3 views
0

Я знаю External merge sort и как он работает. Но в настоящее время я застреваю во время его реализации. Я написал код для сортировки и слияния массивов, но я столкнулся с проблемой во время чтения и записи данных из/в файл, я хочу, чтобы реализовать следующие методы в C++:Реализация внешнего слияния Сортировка

1. int * read(int s, int e) : This method should read from file all the number 
starting from 's' till 'e' and return the array 
2. write(int a[], int s, int e) : This method should write to file the input 
array by replacing the numbers from s to e. 

Для например.

Given file has the following numbers: 

1 
2 
3 
4 
5 
6 

read(0, 2) should return [1,2,3] 
write([4,5,6], 0, 2) should update the file to : 
4 
5 
6 
4 
5 
6 

Как реализовать оба этих метода?

ответ

1

Первое, что вам нужно сделать, это прекратить работу с необработанными указателями.

std::vector<int> будет таким же эффективным и менее подверженным ошибкам.

Во-вторых, формат файла имеет значение. Я буду считать двоичный файл с упакованными 32-разрядными целыми знаками.

Подпись для чтения и записи теперь:

std::vector<int> read(std::ifstream const& f, int offset); 
void write(std::ofstream& f, int offset, std::vector<int> const& data); 

ifstream и ofstream есть искать методы - в частности, ifstream имеет seekg и ofstream имеет seekp.

ifstream.read(char* , length) читает length байт из файла в текущей точке ПОЛУЧИТЬ (устанавливается seekg и выдвинутой read). Если вас не интересует макет памяти вашего файла, вы можете получить .data() из std::vector<int>, переинтерпретировать его до char* и перейти к read(reinterpret_cast<char*>(vec.data()), sizeof(int)*vec.size()), чтобы читать в буфере все сразу.

ofstream имеет аналогичный метод write, который работает точно так же.

При записи данных на диск и обратно опасно, в большинстве (каждой?) Реализации вы будете в безопасности с данными, записанными и прочитанными в том же сеансе выполнения (и, возможно, даже между сеансами). Будьте внимательны, если данные предназначены для сохранения между сеансами или если они выводятся/вводятся из вашего кода.

0

Нет стандартных функций C++ для перехода к строкам в файлах. Таким образом, вы должны прочитать файл строки за строкой (например, с getline. http://www.cplusplus.com/reference/string/string/getline/).

Насколько я помню, внешняя сортировка слияния (старая, предназначенная для компьютера с несколькими накопителями на магнитной ленте) при использовании с отдельными файлами не нуждается в таком интерфейсе, как у вас - вы можете работать последовательно.

+0

Как упоминалось в Yakk, можно перейти к строке в текстовом файле, используя функции istream :: seekg и istream :: tellg. Однако я не уверен в сложности и эффективности этих функций. См. Пример по следующей ссылке: http://www.cplusplus.com/reference/istream/istream/seekg/ –

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