Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Realise версия работает, а Debug версия программы вылетает!  (Прочитано 12045 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
andrystepa
Помогающий

ru
Offline Offline

« : 25-12-2006 12:52 » 

Не могу нормально отладить программу! Debug версия программы почему-то вылетает с сообщением:
Цитата
Debug assertion Failed
Program: filemodify
File: isctype.c
Line: 56

Expression: (unsigned)(c+1)<=256
Вообще то я макросов assert никуда не вставлял. Программа берет csv файл со списком телефонов, удаляет из него лишние символы (';'), и записывает полученный список телефонов в удобочитаемом виде в текстовый файл.
Код:
#include<iostream>
#include<fstream>
#include<string>
#include<iomanip>

using namespace std;
void zamchars(string& str2ed, char ch2del) //Заменяем символы ch2del на пробелы
{
for(int i=1; i<str2ed.length(); i++) {
if(str2ed[i]==ch2del) str2ed[i]=' ';
};
}
void delspace(string& str2ed) //Удаление двойных пробелов
{
for(int i=1; i<str2ed.length(); i++) {
if(isspace(str2ed[i]) && isspace(str2ed[i-1])) {
//cout<<"In string "<<str2ed<<endl;
//cout<<"Found double space in pos "<<i<<endl;
str2ed=str2ed.erase(i-1, 1);
i--;
//cout<<"Double space erased! New string:"<<str2ed<<endl;
//char sel;
//cin>>sel;
};
};
}

void getnewline(ifstream& infile, ofstream& outfile, int lencell)
{
string newstr, orgname, telnum, nextstr;
do {
getline(infile, newstr);
char next;
infile.get(next); //Проверим, не остался ли конец этой
while(!isalpha(next)) // строки на следующих строках критерий - число
{ //или знак препинания.
infile.putback(next);
getline(infile, nextstr);
infile.get(next);
newstr=newstr+nextstr;
};
infile.putback(next);
zamchars(newstr, ';');
delspace(newstr); //убираем лишние знаки и пробелы
int i=0;
while(!isdigit(newstr[i]) && (newstr[i]!='+')) i++;
newstr.insert(i, "\n"); //Добавляем перевод строки перед номером телефона
outfile<<setw(82)<<newstr<<endl;
for(i=0; i<82; i++) outfile<<"-";
outfile<<endl; //Вывод в файл с разделением записей
} while(!infile.eof());
}


/*void getfileline(ifstream& infile, ofstream& outfile, int lencell) {
string orgname, telnum, nextstr;
do {
getline(infile, orgname, ';');
int len=orgname.length();
int koeff=len/lencell;
if((len%lencell)==0) koeff--;
int i=1;
while(koeff>0) { orgname.insert(lencell*i,1, '\n');
i++;
koeff--;
};
while((orgname.length()%lencell)!=0) {
orgname.insert(orgname.length(),1,' ');
};
char next;
do { infile.get(next); } while(next==';');
if(next!=';') infile.putback(next);
//while(next!='\n') {
//infile.putback(next);
getline(infile, telnum);
infile.get(next);
while(next==';') {
getline(infile, nextstr);
telnum=telnum+nextstr;
infile.get(next);
};
infile.putback(next);
for(int i=0; i<telnum.length(); i++) {
if(telnum[i]==';') telnum[i]=' ';
}
//delchars(telnum, ' ');
delspace(telnum);
//do{infile.get(next); } while(next==';');
//outfile.seekp(lencell+4);
if(isdigit(telnum[1])) {
outfile<<setw(82)<<orgname<<endl;
outfile<<" "<<setw(telnum.length()+2)
<<setiosflags(ios::left)<<telnum<<endl;
for(i=0; i<82; i++) outfile<<"-";
outfile<<endl;
};
//infile.get(next);
} while(!infile.eof());
outfile<<endl;
}*/


int main() {
/*if(argc!=3) {cout<<"Use program: filemodify infile outfile"<<endl;
exit(1);
}*/
string firstfile;
string secfile;
cout<<"Enter input file name >";
cin>>firstfile;
cout<<endl<<"Enter output file name >";
cin>>secfile;
cout<<endl;
ifstream fin;
ofstream fout;
fin.open(firstfile.c_str());
if(fin.fail()) { cout<<"Error open "<<firstfile<<endl;
char sel;
cin>>sel;
exit(1);
}
fout.open(secfile.c_str());
if(fout.fail()) { cout<<"Error open "<<secfile<<endl;
exit(1);
}
int cell_length;
cout<<"Enter a length of Company name  cell >";
cin>>cell_length;
cout<<endl;
//getfileline(fin, fout, cell_length);
getnewline(fin, fout, 82);
fin.close();
fout.close();
return 0;
}

Частично приведу файл, на котором вылетаем:
Цитата
Radisson SAS Slavyanskaya Hotel;80959418118;80959418668;;;;;;;
;;9518138;;;;;;;
METRO Cash&Carry OOO;80955021052;80955021096;;;;;;;
Бритиш Бродкастинг Корпорейшн;80957752957;;;;;;;;
ЮГНПЦ Прогресс;593386;8103800482593348;;;;;;;
;;;;;;;;;89161248772
МГУП Промотходы;;;;;;;80956810892;;
МГУП Промотходы;;80952380572;;80957604014;;;80954350954;;80957680586
ООО «МКФ ЭНЕРГО»;80957252426;89164484431;;;;;;;80951399815
Экоцентр;;;;;;;3531510;;
Пробирная палата России Центральная госинспекция;;80952097261;;;;;5903473;;89169606004
МГУП Промотходы;;9591618;;;;;;;89167071916
ООО «МКФ ЭНЕРГО»;;80957252426;;;;;;;89161463271
Коммерческий банк «Альта-банк» (ЗАО);;80952731357;;;;;;;
МГУП Промотходы;;80952386685;;;;;;;
ООО Филипс;80959330338;80959330339;;;;;;;1064856
МГУП Промотходы;;80959591713;;;;;;;
Московская Межбанковская Валютная Биржа;7059622;7059672;;;;;;;89161648785
ОАО МТС;7660180;9112190 доб 17561;;;;;;;89165181757
МГУП Промотходы;;80952562003;;;;;;;89161857744
Debug версия программы вылетает после вывода в новый файл строчки с:
ОАО МТС;7660180;9112190 доб 17561;;;;;;;89165181757

При этом Realise версия работает, но, к сожалению, кое-где не полностью удаляет лишние символы. Почему-понять не могу, так как отладка не успевает дойти до этого места. Помогите - ооочень нужна программка.
« Последнее редактирование: 11-12-2007 17:58 от Алексей1153++ » Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #1 : 25-12-2006 14:16 » 

Всё очень просто ты, где-то пытаешься загнать в char число 256 которое туда не лезеть в релизе CRT не делает этих проверок поэтому у тебя работает
а вообще код страшненький
Записан

Странно всё это....
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #2 : 25-12-2006 16:55 » 

Ужасть...
Записан

А птичку нашу прошу не обижать!!!
andrystepa
Помогающий

ru
Offline Offline

« Ответ #3 : 25-12-2006 18:05 » new

Код страшный, не спорю. Просто надо было срочно-срочно привести к удобочитаемому состоянию список телефонов, размером в 60 страниц 10 кеглем, импортированный из Excel в формат csv. Делать это вручную можно было до второго пришествия. Поэтому в срочном порядке слепил то, что сразу пришло в голову (см. закомментированную часть - с ней все работало), а потом уже решил привести в более-менее универсальный вид. И все же непонятно, где я загоняю в char число больше 256? Ошибка проявляется где-то в глубинах подключаемых библиотек, а вот чем она вызвана?
Кстати, попутно наткнулся на проблему с функцией isalpha(), которая не срабатывает на кириллицу. Когда-то я натыкался в инете на описание, как решить эту проблемму. Но сейчас ссылка потерялась. Может кто подскажет?
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #4 : 26-12-2006 06:49 » 

Не отмазка не канает.
Пробелы попробуй пропускать
используя std::string::first_not_of("\t ", currentPos);
Более всего в тупик ставит вот это:
Код:
while(!isalpha(next))// строки на следующих строках критерий - число
{//или знак препинания.
infile.putback(next);
getline(infile, nextstr);
infile.get(next);
newstr=newstr+nextstr;
};
infile.putback(next);
Особенно последняя строка.

Единственно что показалось разумным это getline(infile, orgname, ';');
Почему ты не пишешь сразу в outfile а держишь данные в промежуточных объектах затем, что-то там подчищаешь, пиши срузу на выход лишние данные просто не пиши. Кроме, того getline() не возвращает разделитель, и вот такая штука ";;;" будет возвращать пустые строки которые можно писать конечно на выход, но смысла нет Улыбаюсь пустота проверяется мтодом empty Улыбаюсь

посмотри еще на boost::tokenizer
« Последнее редактирование: 11-12-2007 18:02 от Алексей1153++ » Записан

Странно всё это....
andrystepa
Помогающий

ru
Offline Offline

« Ответ #5 : 26-12-2006 10:26 » 

Пробелы попробуй пропускать
используя std::string::first_not_of("\t ", currentPos);
Но ведь пробелы все таки нужны - они слова разделяют. Или лучше писать в выходной поток не всю строку, а по словам? А чем лучше?
Цитата
Более всего в тупик ставит вот это:
Код:
while(!isalpha(next))// строки на следующих строках критерий - число
{//или знак препинания.
infile.putback(next);
getline(infile, nextstr);
infile.get(next);
newstr=newstr+nextstr;
};
infile.putback(next);
Особенно последняя строка.

Но ведь если я не верну next, то пропадет первая буква в следующей строке! Впрочем с isalpha все равно ничего не получается. Там часть текста по-английски, а часть по-русски. И русские буквы isalpha не ловит. Так что в текущем варианте я проверяю на отсуствие ';' в начале новой строки. Хотя это конечно может привести к потере  части строки.

Цитата
Единственно что показалось разумным это getline(infile, orgname, ';');
Почему ты не пишешь сразу в outfile а держишь данные в промежуточных объектах затем, что-то там подчищаешь, пиши срузу на выход лишние данные просто не пиши. Кроме, того getline() не возвращает разделитель, и вот такая штука ";;;" будет возвращать пустые строки которые можно писать конечно на выход, но смысла нет Улыбаюсь пустота проверяется мтодом empty Улыбаюсь

посмотри еще на boost::tokenizer
Опять таки спешил! Хотелось сформировать строку целиком, а потом ее в файл писать. Да и, честно говоря, писал исходя из тех функций, которые знал и помнил. Лезть в книжки и справочники не было ни времени, ни возможности. К примеру, о вышеупомянутом методе empty я и не слышал.
Опять таки, не хочется брать в качестве разделителя именно ';' - хотелось попутно написать что-то более универсальное.
« Последнее редактирование: 11-12-2007 18:03 от Алексей1153++ » Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 26-12-2006 12:03 » 

Извините, что не в тему.

В таких ситуациях:
Код:
METRO Cash&Carry OOO;80955021052;80955021096;;;;;;;
Бритиш Бродкастинг Корпорейшн;80957752957;;;;;;;;
ЮГНПЦ Прогресс;593386;8103800482593348;;;;;;;
;;;;;;;;;89161248772
МГУП Промотходы;;;;;;;80956810892;;
МГУП Промотходы;;80952380572;;80957604014;;;80954350954;;80957680586
ООО «МКФ ЭНЕРГО»;80957252426;89164484431;;;;;;;80951399815
Экоцентр;;;;;;;3531510;;
Perl рулит. Что то типа такого шаблона:
Код:
/;(\d+);/
и все проблемы решены. И никакой головной боли.  Да-да
Записан
andrystepa
Помогающий

ru
Offline Offline

« Ответ #7 : 26-12-2006 18:24 » 

Возможно Perl и рулит, сильно полагаю, что здесь можно было и без него обойтись - написать скриптик с регекспами просто в bash (может даже получилось бы написать .cmd файл), но, каюсь, ни в Perl, ни в скриптах bash, ни в написании банальных .cmd файлов ничегошеньки не смыслю! Все мои знания заканчиваются 16 битными приложениями на Assembler'е (ну, может еще немножко и 32 битные могу), да начальными знаниями в C++ (полгода как начал изучать). Поэтому писал в чем мог (ну и в чем мне сейчас интереснее).
Впрочем, регекспы тут не везде помогут. Некоторые записи переносятся на 2-3 строки, и кроме того, много записей на одно и то же название организации, но с разными телефонами. А задача состоит еще и в том, чтобы их объединить. Хотя и в С++ не очень представляю себе, как это не сильно криво сделать. Разве что составить из записей связный список, а потом его сортировать. Но боюсь что 60 страниц записей сожрут тучу памяти, если их загрузить в список.
« Последнее редактирование: 11-12-2007 18:04 от Алексей1153++ » Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #8 : 27-12-2006 06:35 » 

попробуй вот это:
Код:
int main() {
std::stringstream sstr(
"Radisson SAS Slavyanskaya Hotel;80959418118;80959418668;;;;;;;\n"
";;9518138;;;;;;;\n"
"METRO Cash&Carry OOO;80955021052;80955021096;;;;;;;\n"
"Бритиш Бродкастинг Корпорейшн;80957752957;;;;;;;;\n"
"ЮГНПЦ Прогресс;593386;8103800482593348;;;;;;;\n"
";;;;;;;;;89161248772\n"
"МГУП Промотходы;;;;;;;80956810892;;\n"
"МГУП Промотходы;;80952380572;;80957604014;;;80954350954;;80957680586\n"
"ООО «МКФ ЭНЕРГО»;80957252426;89164484431;;;;;;;80951399815\n"
"Экоцентр;;;;;;;3531510;;\n"
"Пробирная палата России Центральная госинспекция;;80952097261;;;;;5903473;;89169606004\n"
"МГУП Промотходы;;9591618;;;;;;;89167071916\n"
"ООО «МКФ ЭНЕРГО»;;80957252426;;;;;;;89161463271\n"
"Коммерческий банк «Альта-банк» (ЗАО);;80952731357;;;;;;;\n"
"МГУП Промотходы;;80952386685;;;;;;;\n"
"ООО Филипс;80959330338;80959330339;;;;;;;1064856\n"
"МГУП Промотходы;;80959591713;;;;;;;\n"
"Московская Межбанковская Валютная Биржа;7059622;7059672;;;;;;;89161648785\n"
"ОАО МТС;7660180;9112190 доб 17561;;;;;;;89165181757\n"
"МГУП Промотходы;;80952562003;;;;;;;89161857744\n"
);

std::string str;
while (!getline(sstr,str,';').eof())
{
if (!str.empty() && str[0] > 0x0D)
{
if (!isdigit(str[0]) && str[0]!='+')
cout << str << "\n";
else
cout << setw(10) << " "<< setw(18) << setiosflags(ios::left) << str << "\n";
}
}
return 0;
}
Ага
« Последнее редактирование: 11-12-2007 18:05 от Алексей1153++ » Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines