1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Будьте добры,уважаемые форумчане можете исправить ошибку в данном коде программе.Уж очень срочно надо.Буду очень признателен.А вот и само условие и код программы: Исходные данные находятся в текстовом файле. Разделитель – конец строки. Программа запрашивает имя входного и результирующего (отсортиро-ванного) файла. Использовать динамическое распределение памяти.И надо сортировать строки методом пузырька.Тут как бы всё правилььно выполняет,только вот пишет ошибку .. и как мне подсказывали что-то с указателями.Или после кода программы"void main(void)..."
Вообщем всё понятно,но возникли небольшие вопросики. 1-Почему,в коде программы нельзя было просто написать до N,а не n_lines? 2-И у Вас в комментарии написано,что "до n_lines - 1"Причём тут единица. 3-И если не трудно,можно ещё пару слов об "os"ЧТо это такое?Я как понял,это назваине потока,благодаря чему будет копироваться троки в файл.Я так понял?
-
// для всех номеров строк от 0 до n_lines - 1 (в С++ индексация всегда начинается с 0) for(int i = 0; i < n_lines; i++) {
Я так подумал вышлю остальной код программы(если не трудно прокментировать его),чтобы после сего,по частям разбарал бы и если что вопрсоызадавал бы.Думаю так быстрее будет,чем по частям высылать и так же уже нужно скоро уже относить программу. p/S/Я ещё раз хочу выразить благодарность за помощь студенту. -
1-Почему,в коде программы нельзя было просто написать до N,а не n_lines?
Ну, если тебе удобнее до N, то пиши до N, я привык давать "говорящие" имена переменным...
Цитата(V.k.l.chr.by @ 15.05.2008 22:03)
в комментарии написано,что "до n_lines - 1"Причём тут единица.
При том, что если число строк это n_lines, то значит, их индексы - от 0 до (n_lines-1)
Цитата(V.k.l.chr.by @ 15.05.2008 22:03)
можно ещё пару слов об "os"ЧТо это такое?
Это поток вывода, os (сокращение от output stream)... Понимаешь в чем дело... Когда запускается программа на С++, создаются несколько потоков. Один (cout, стандартный вывод на экран) - для вывода данных, другой (cin, стандартный ввод с клавиатуры) - для ввода данных в программу. Ну, есть еще cerr/clog, но это пока не важно... Так вот, cout имеет тип ostream. От этого же типа унаследован и файловый поток (ofstream), то есть, в свою процедуру я могу передать (по правилу совместимости типов) не только сам cout, но и любого его наследника, и если я передам файловый поток, то все то, что должно было бы напечататься на экране, будет выведено в файл... Чем я и воспользовался... Когда мне нужно - вывожу данные на монитор, а когда нужно - в файл...
Теперь что касается остальной программы:
Это - самая обычная сортировка "пузырьком" массива ptr, содержащего n_lines строк. Алгоритм этот найдешь на любом сайте, да хоть у нас в FAQ-е по Паскалю: Методы сортировок
// место для имен входного/выходного файлов char in_name[64], out_name[64];
// максимальное число строк, которые будут обрабатываться. // Если в файле будет больше строк, чем указано здесь - то массив, // описанный чуть ниже, переполнится и получишь Access Violation - ошибку доступа const int maxLines = 1000;
// Вот, собственно, массив для хранения указателей на строки char *ptr[maxLines];
// запрашиваем у пользователя и вводим имя входного файла cout << s_in_name; cin >> in_name;
// открываем файловый поток in для чтения ifstream in(in_name, ios::in); if(!in) { // поток не открылся, выходим с ошибкой cout << s_err_open << endl; return -1; }
// запрашиваем и принимаем от пользователя имя выходного файла cout << s_out_name; cin >> out_name;
// опять же открываем файловый поток, но теперь уже на запись ofstream out(out_name, ios::out); if(!out) { // не открылся - ошибка cout << s_err_open << endl; return -1; } // максимальное количество символов, читаемое из файла за один раз const int buf_size = 1024; // ну, и буфер для временного хранения прочитанной из файла строки char buffer[buf_size];
// здесь будет номер строки, прочитанной из файла на каждой итерации цикла // для начала (-1), потом поймешь почему... int current = -1;
// попытка прочесть до buf_size символов (на самом деле может быть прочитано // и меньше, поскольку чтение завершится как только встретится символ "\n") // из файла in в buffer... // пока эти попытки успешны (т.е., строка читается) while(in.getline(buffer, buf_size)) { // увеличиваем номер текущей строки (теперь понятно, почему изначально был (-1)? // Потому что начинается индексация с 0), и для текущего номера выделяется память, // достаточная для хранения прочитанной из файла строки... ptr[++current] = new char[strlen(buffer) + 1];
// как только память выделена - копируем строку из временного буфера в дин. память strcpy(ptr[current], buffer); }
// Ну, а дальше - все просто: выводим все прочитанные строки в cout // (т.е., на монитор), как именно, я уже объяснял cout << s_before << endl; write_lines(cout, ptr, current + 1);
// сортируем массив строк (поскольку current содержит индекс последней // прочитанной строки начиная с 0, а в процедуру сортировки нужно передать // КОЛИЧЕСТВО строк, то передаем current + 1) sort(ptr, current + 1);
// и уже отсортированные строки выводим сначала на монитор (cout)... cout << s_after << endl; write_lines(cout, ptr, current + 1);
// ... а потом - в файловый поток, открытый нами для записи write_lines(out, ptr, current + 1);
// Все, строки сохранены, можно дин. память освобождать for(int i = 0; i <= current; i++) { delete ptr[i]; }