![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 10.08.2011
Сообщений: 2
|
![]()
Господа форумчане!
Я в среде С++ недавно,но тем не менее пытаюсь написать программу для статистического анализа. На данный момент есть кусок кода для чтения файла с данными, которые располагаются так: "12\31\2010 Evening Pick 3 1-9-1" Все бы не плохо, только вот при выполнении куска кода выпадает ошибка std::bad_alloc. (при чтении стори этак 168й в файле) Хотелось бы узнать что это, и с чем его едят? Вот код: // Lottery.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { return 0; } enum ConsoleColor { Black = 0, Blue = 1, Green = 2, Cyan = 3, Red = 4, Magenta = 5, Brown = 6, LightGray = 7, DarkGray = 8, LightBlue = 9, LightGreen = 10, LightCyan = 11, LightRed = 12, LightMagenta = 13, Yellow = 14, White = 15 }; void SetColor(ConsoleColor text, ConsoleColor background) { HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text)); } void ERR() { SetColor(LightRed,Black); cout<<"Oops! There is an error somewhere. Please try again."<<"\n"; cout<<"---------------------------------------------------"<<"\n\n\n\a"; SetColor(LightGreen,Black); } void SUCS() { cout<<"Your data were successfully processed."<<"\n\n\n"; } void main() { SetColor(LightGreen,Black); std::cout<<"Greetings! You're using program 'MoneyMaker' v.0.75!"<<"\n\n\a"; FILE *Infl; char *Path=new char[255]; _strt:std::cout<<"Insert path to the data file please:"<<"\n"; SetColor(LightCyan,Black); std::cin.get(Path,255); SetColor(LightGreen,Black); Infl=fopen(Path,"r"); if (Infl==NULL) {SetColor(LightRed,Black);perror ("Error opening file");SetColor(LightGreen,Black);s td::cin.get();goto _strt;} cout<<"File ";SetColor(LightCyan,Black);cout<<P ath;SetColor(LightGreen,Black);cout <<" was successfully opened. Plese wait while programm will process your data."<<"\n"; delete[] Path; //Просматриваем файл и считаем сколько разных розыгрешей там было, соответсвенно после делаем массив(х) для каждого розыгрыша. //Паралельно считаем ширину массива и длинну. //int *Dt_d=new int,*Dt_m=new int,*Dt_y=new int; string Name("\0",19);char *char1=new char,*char2=new char,*Str=new char[100];char1=NULL;char2=NULL; struct { string names[50]; int width[50],height[50]; }P; int *i=new int,Point=0,temp=0;*i=0; while(!(feof(Infl)))//читать как строку { fgets(Str,80,Infl);//getting string while(!(*Str==' '))//going thru dates { Str++; } while(*Str==' ')//going thru spaces { Str++; } char1=NULL;char2=NULL;Name=" "; do//Name's being reading. { char1=Str;Str++;char2=Str; if(!((*char1==' ' && *char2==' ')||(Name.length()==19)))Name=Name+ *char1+*char2;else break;Str++; }while(!(*char1==' ' && *char2==' ')); while(*Str==' ')//going thru spaces { Str++; } temp=0;*i=0; do //Number's turn; { temp++; do Str++; while(!((*Str=='-')||(*Str==' ')||(*Str=='['))); }while(*Str=='-'); for(int k=0;k<Point;k++)//searsching for right place, if no - creating one. { if(Name==P.names[k]){if(P.width[k]==0)P.width[k]=temp;P.height[k]++;goto _mid;} } P.names[Point]=Name;P.height[Point]=1;P.width[Point]=temp;Point++; _mid:std::cout<<"."; if(feof(Infl))break; } cout<<"\nData was successfully readed.\n"; rewind(Infl); _getch(); } Идея: читаем строку из файла,пропускаем дату и пробелы до названия(Evening Pick 3) - пишем его в Name, далее пропускаем пробелы и читаем количество чисел(9-3-6)по прочеркам(-),сравниваем Name с уже записанными именами и если находим - длинна++, если нет - пишем в новую ячейку на которую тыкает Point.Вотъ... Компилятор - Microsoft Visual C++ Express 2010. Функции : _tmain - понятия не имею зачем она там, но она родная SetColor - задание цвета текста и фона экрана найденное где-то в инете. ERR и SUCS ! просто выводят сообщение. Переменные : *Path - путь к файлу *Infl - собственно указатель на файл. Name - имя которое будет сравниться с уже имеющимисью *char1 *char2 - чары для проверки конца чтения(двойной пробел, и т.д.) *Str - строка из файла. а точнее указатель на нее. struct { string names[50]; int width[50],height[50]; }P; - уже имеюшиесь записи игр и ширины и длинны матриц нужных для них. Point - показывает которая ячейка свободна для записи в P.names |
![]() |
![]() |
![]() |
#2 |
Новичок
Джуниор
Регистрация: 10.08.2011
Сообщений: 2
|
![]()
Вот что по этому поводу пишет с++:
http://www.cplusplus.com/reference/std/new/bad_alloc/ |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
E2015 Ambiguity between 'std::log(double)' and 'std::log(long double)' | Namolem | Помощь студентам | 3 | 02.04.2011 20:22 |
ошибка: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char> | Critter | Общие вопросы C/C++ | 5 | 08.08.2010 23:38 |
(C++) bad_alloc (подавление/обход) | Troi666 | Помощь студентам | 6 | 13.08.2009 21:58 |
проблема с std::ifstream.eof() | alex8 | Общие вопросы C/C++ | 5 | 05.05.2009 18:24 |
С++|bad_alloc|Заполнение оперативной памяти | Troi666 | Помощь студентам | 0 | 30.04.2009 00:15 |