Форум программистов, компьютерный форум CyberForum.ru

Задан текстовый файл, необходимо по нему сформировать двоичный файл индексов - C++

Восстановить пароль Регистрация
 
Nerevarin
0 / 0 / 0
Регистрация: 24.10.2014
Сообщений: 6
21.11.2014, 17:28     Задан текстовый файл, необходимо по нему сформировать двоичный файл индексов #1
Нужна помощь! Задача: Задан текстовый файл, необходимо по нему сформировать двоичный файл индексов (смещений начал строк в текстовом файле). Имя входного (текстового) файла задается в виде аргумента командной строки. Имя выходного (двоичного) файла генерируется программой: он должен иметь то же имя, что и входной, но другое расширение - “.idx”. Написать максимально эффективную функцию вывода строки с заданным номером из текстового файла на экран, используя файл индекса.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2014, 17:28     Задан текстовый файл, необходимо по нему сформировать двоичный файл индексов
Посмотрите здесь:

Задан текстовый файл Input.txt... C++
Двоичный и текстовый файл на C++ C++
C++ Текстовый файл перевести в двоичный, а потом полученный двоичный файл перевести обратно в текстовый
Что быстрее - двоичный или текстовый файл? C++
Сформировать двоичный файл из элементов, заданных в варианте структур C++
Структуры: сформировать двоичный файл, записав в него всю известную информацию о каждом сотруднике C++
C++ Создать текстовый файл и записать в двоичный файл
Задан текстовый файл. Напечатать первую из самых коротких его строк C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
21.11.2014, 19:41     Задан текстовый файл, необходимо по нему сформировать двоичный файл индексов #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
#include <fstream>
#include <string>
#include <memory>
#include <stdexcept>
#include <exception>
 
using char_t = char;
using txt_ifstream = std::basic_ifstream < char_t >;
using txt_ofstream = std::basic_ofstream < char_t >;
 
using idx_ifstream = std::basic_ifstream < std::streamsize >;
using idx_ofstream = std::basic_ofstream < std::streamsize >;
 
using string = std::basic_string < char_t >;
 
void make_idx(
        txt_ifstream &txt,
        idx_ofstream &idx,
        std::streamsize bsize = 4*1024
) {
    std::unique_ptr<char_t> buffer;
    std::streamsize position = 0;
    std::streamsize count;
    txt.seekg(0);
    buffer.reset(new char_t[bsize]);
    idx.seekp(0);
    idx.write(&position, 1);
    do {
        count = txt.readsome(buffer.get(), bsize);
        char_t* first = buffer.get();
        char_t* last = first + count;
        while (last != first) {
            if (*first == '\n')
                idx.write(&position, 1);
            ++first;
            ++position;
        }
    } while (count == bsize);
    idx.write(&position, 1);
}
 
string get_string(
            txt_ifstream &txt,
            idx_ifstream &idx,
            std::streamsize id
) {
    std::streamsize first, last, length;
    std::unique_ptr<char_t> line;
 
    if (!idx.seekg(id)) throw std::exception("idx.seekg",__LINE__);
    if (!idx.read(&first, 1)) throw std::exception("idx.read", __LINE__);
    if (!idx.read(&last, 1)) throw std::exception("idx.read", __LINE__);
    length = last - first;
 
    line.reset(new char_t[length + 1]);
    txt.seekg(first);
    txt.read(line.get(), length);
    line.get()[length] = char_t(0);
 
    return string(line.get());
}
 
int main(int argc, char_t **argv) {
    txt_ifstream txt;
    idx_ifstream in;
    idx_ofstream out;
 
    if (argc != 2) return 0xbad;
    string fname = argv[1];
    txt.open(fname + ".txt", std::ios::in | std::ios::binary);
    out.open(fname + ".idx", std::ios::out | std::ios::binary);
    make_idx(txt, out, 1024*1024);
    out.close();
 
 
    in.open(fname + ".idx", std::ios::in | std::ios::binary);
    std::cout << get_string(txt, in, 42) << std::endl;
 
    return 0;
}
как то так
Yandex
Объявления
21.11.2014, 19:41     Задан текстовый файл, необходимо по нему сформировать двоичный файл индексов
Ответ Создать тему
Опции темы

Текущее время: 18:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru