Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 582
от 14.11.2006, 15:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 420, Экспертов: 51
В номере:Вопросов: 3, Ответов: 5


Вопрос № 61803: <b><font color=purple>Уважаемый эксперты</font></b> поскольку с языком программирование <b>С++</b> я на Вы, то решил обратиться за вашей помощью.... Есть задача (условие смотрите ниже), сталкнулся с ней в ходе самостоятельно изучения С++, та...
Вопрос № 61869: Здравствуйте уважаемые эксперты. Вопрос таков. Есть некий класс содержащий несколько полей с данными и нужно перегрузить приведение типов для него в ситуации типа той что описана в приложении. Перегрузка оператора присваивания это немного не ...
Вопрос № 61878: Здравствуйте, эксперты! Проблема такая: нужно подключить необходимые файлы OpenGL к C++ Builder6.0, точно не знаю как их надо подключать, да и в наличии только все то, что нужно для MS Visual C++6.0, а они не подходят. Пришлите, пожалуйста, ссылки, г...

Вопрос № 61.803
Уважаемый эксперты поскольку с языком программирование С++ я на Вы, то решил обратиться за вашей помощью....

Есть задача (условие смотрите ниже), сталкнулся с ней в ходе самостоятельно изучения С++, так вот необходимо ее решить, как данная программа решается средствами языка Pascal/Delphi - я знаю. Но мне хотелось бы увидеть решение на С++ (причем если это возможно различными способами и с соответствующими коментариями).

Всем зарание спасибо!!!

Условие задачи:
Дан текстовый файл (old.dat), заканчивающийся точкой, в котором слова разделены пробелом, а конце каждой строки точка с запятой.
Создать новый текстовый файл (new.dat) на основе исходного, который состоит из строк исходного в
обратном порядке.

Пример:
old.dat
--------
первая строка первая строка;
вторая строка;
третья строка третья строка третья строка.
new.dat
--------
третья строка третья строка третья строка.
вторая строка;
первая строка первая строка;
Отправлен: 08.11.2006, 16:14
Вопрос задал: Gh0stik (статус: Практикант)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Sergey A. Wedensky
Здравствуйте, Gh0stik!

Вариант I. Самый банальный - прочесть все строки в память и записать в выходной файл в обратном порядке. Недостаток - необходимость выделения памяти объемом равным размеру файла.
Код см. в приложении (1).

Вариант II. С записью в промежуточный файл.
1. Читаем из входного файла, записываем во временный, переворачивая слева направо каждую строку.
2. Копируем в выходной файл содержимое временного в обратном порядке.
Максимальный объем выделяемой памяти равен длине самой длинной строки файла.
Код см. в приложении (2).

Удачи!

Приложение:

Ответ отправил: Sergey A. Wedensky (статус: 7-ой класс)
Ответ отправлен: 08.11.2006, 17:20
Оценка за ответ: 5

Отвечает: AlexKlaip
Здравствуйте, Gh0stik!

С использованием MFC:

CStringArray astr;
CString str;
char* pFileName = "Путь и имя файла исходного";
char* pFileOut = "Путь и имя файла результата";
CStdioFile file;
int i;

if( !file.Open( pFileName, CFile::modeRead ) )
{
#ifdef _DEBUG
afxDump << "Unable to open file for read" << " ";
#endif
}
else
{
while(true)
{
if( file.ReadString(str) == FALSE )
break;
astr.Add(str);
}
file.Close();
}
if( !file.Open( pFileName, CFile::modeCreate|CFile::modeWrite ) )
{
#ifdef _DEBUG
afxDump << "Unable to open file for write" << " ";
#endif
}
else
{
for(i=astr.GetUpperBound(); i>=0; --i)
file.WriteString(astr[i]);
file.Close();
}
astr.RemoveAll();

Примечание файл считывается в память, поэтому желательно применять для
не очень больших файлов.
Если кол-во строк известно, то можно значительно ускорить:

CStringArray astr;
CString str;
char* pFileName = "Путь и имя файла исходного";
char* pFileOut = "Путь и имя файла результата";
CStdioFile file;
int i;

if( !file.Open( pFileName, CFile::modeRead ) )
{
#ifdef _DEBUG
afxDump << "Unable to open file for read" << " ";
#endif
}
else
{
astr.SetSize(кол-во строк);
for(i=0; i<кол-во строк; ++i)
{
if( file.ReadString(str) == FALSE )
break;
astr[i] = str;
}
//на случай если строк в файле было меньше
astr.SetSize(i);
astr.FreeExtra();
file.Close();
}
if( !file.Open( pFileName, CFile::modeCreate|CFile::modeWrite ) )
{
#ifdef _DEBUG
afxDump << "Unable to open file for write" << " ";
#endif
}
else
{
for(i=astr.GetUpperBound(); i>=0; --i)
file.WriteString(astr[i]);
file.Close();
}
astr.RemoveAll();
Ответ отправил: AlexKlaip (статус: 2-ой класс)
Ответ отправлен: 08.11.2006, 18:09
Оценка за ответ: 5

Отвечает: Ross
Здравствуйте, Gh0stik!

Можно создать вспомогательный массив, содержащий позиции в файле, с которых начинается новая строка. Потом перемещая указатель от последней строки к первой, перезаписать их в new.dat

Приложение:

Ответ отправил: Ross (статус: 2-ой класс)
Ответ отправлен: 09.11.2006, 22:07
Оценка за ответ: 4
Комментарий оценки:
Как-то уж больно громоздко....


Вопрос № 61.869
Здравствуйте уважаемые эксперты.
Вопрос таков. Есть некий класс содержащий несколько полей с данными и нужно перегрузить приведение типов для него в ситуации типа той что описана в приложении.
Перегрузка оператора присваивания это немного не то. Если бы класс к которому приводится наш пользовательский тоже определялся программистом, задача сводилась бы к тому, что бы описать соответствующий конструктор копирования (как я понимаю). В данном же примере мы приводим к предопределенному типу, тоесть реально нужно делать что-то с самим классом над SomeClass, но что именно я никак понять не могу.
Буду очень признателен за любую помощь.

Приложение:

Отправлен: 09.11.2006, 00:17
Вопрос задал: Юра (статус: 2-ой класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Bob Johnson
Здравствуйте, Юра!
сумбурно ты написал...
конструктор копирования позволяет оперировать только с экземплярами одного и того же класса. тебе скорее всего поможет оператор приведения типа, позволяющий произвести необходимые манипуляции над данными класса, а затем выдать результат нужного типа, например:

class SomeClass
{
public:
operator string ();
};

SomeClass::operator string ()
{
string res;
... какие-то действия
return res;
}

теперь можно передавать SomeClass в любую функцию, воспринимающую строку, компилятор сам вызовет этот оператор
Ответ отправил: Bob Johnson (статус: Академик)
Россия, Калуга
WWW: Программирование
----
Ответ отправлен: 09.11.2006, 00:29


Вопрос № 61.878
Здравствуйте, эксперты! Проблема такая: нужно подключить необходимые файлы OpenGL к C++ Builder6.0, точно не знаю как их надо подключать, да и в наличии только все то, что нужно для MS Visual C++6.0, а они не подходят. Пришлите, пожалуйста, ссылки, где можно скачать(бесплатно) необходимые файлы (в первую очередь интересует glut.h для Buildera [т.к. я нигде не cмог найти glut.h совместимый с Builderом]). Нельзя ли заголовочные файлы OpenGL под Visual, отредактировать для Buildera, в частности glut.h? По возможности пришлите, пожалуйста, необходимые файлы (в особенности glut.h) и алгоритм подключения тоже не плохо бы:)
Отправлен: 09.11.2006, 01:57
Вопрос задал: Romych (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Lonely Wolf
Здравствуйте, Romych!
Выбирайте пункт меню project - settings, вкладка Link, далее в поле Object/library modules пишите opengl32.lib glu32.lib glut32.lib.
GLUT библиотека не стандартная, она не входит в стартовый комплект, то что умеет glut умеют opengl и glu, даше лучше. Я был не в восторге от неё. Но раз вам надо то попробуйте найти через google, без проблем отыщите.

---------
Ассемблер FOREVER!!!
Ответ отправил: Lonely Wolf (статус: Студент)
Ответ отправлен: 09.11.2006, 12:48
Оценка за ответ: 1
Комментарий оценки:
Вообще-то, мой вопрос относился к Borland C++Builder6.0, а не к MS Visual C++..., повторюсь:glut для Builder'a6.0, а не для чего-то другого.


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное