Ответил:
изменения
while (tracefile->good()){
getline(*tracefile,line);
....
в
while(getline(*tracefile, line)){
....
сделал трюк. Спасибо, @pmr.
Оригинал:
Я создал симулятор кеша для своего класса компьютерной архитектуры, который должен считываться в файле трассировки, который содержит инструкции по памяти для моего кеша.
При создании программы я использовал файл тестовой трассировки, содержащий только 1000 строк, но реальные файлы трассировки составляют более 50 тыс. Строк. С тестовой трассировкой программа работает отлично. При фактической трассировке программа продолжается до тех пор, пока не попытается использовать .substr () в строке, что вызывает исключение out_of_range и преждевременно останавливает мою программу. Я исследовал и обнаружил, что getline () выдает пустые строки, когда трассировка слишком велика. Помните, что это не происходит по следам <= ~ 5000 строк.
Кто-нибудь знает, почему это происходит? Я использую ifstream, если это имеет значение.
РЕДАКТИРОВАТЬ: извините, вот код. Это не проходит мимо «….»
главный:
cout << "Program started.\n";
string str[6];
int i = 0;
/* check for the correct number of arguments */
if(argc != 3){
cout<<"usage: "<< argv[0] <<" <configfile> <tracefile>\n";
exit(0);
}
string confname = argv[1];
string tracename = argv[2];
/* open the files and check if it worked */
ifstream confile;
ifstream tracefile;
confile.open (argv[1], ios::in);
if (!confile.is_open()){
cout<<"Could not open config file.\n";
exit(0);
}
if (confile.is_open()) cout << "Config file loaded.\n";
tracefile.open (argv[2], ios::in);
if (!tracefile.is_open()){
cout<<"Could not open trace file.\n";
exit(0);
}
if (tracefile.is_open()) cout << "Trace file loaded.\n";
/* read in the data from the config file */
if (confile.is_open()){
i = 0;
while(confile.good() && i != 6){
getline(confile, str[i]);
i++;
}
}
/* create the cache simulator */
cache csim(atoi(str[0].c_str()), atoi(str[1].c_str()),
atoi(str[2].c_str()), atoi(str[3].c_str()),
atoi(str[4].c_str()), atoi(str[5].c_str()));
cout << "Simulator started.\n";
/* send the simulator the trace */
csim.trace(&tracefile);
csim.trace:
cout << "Going through trace...";
int i;
string line;
string tag, index, offset;
this->IC = 0;
/* loop until there is no more lines */
while (tracefile->good()){
/* get the next line and increment the instruction counter */
getline(*tracefile,line);
this->IC++;
/* convert hex address to a binary address */
string address = "";
for (i = 0; i < line.substr(4,8).length (); i++)
{
....
Похоже, что одна из ваших строк может быть недостаточно длинной.
while (getline(*tracefile,line);){
/* get the next line and increment the instruction counter */
this->IC++;
/* convert hex address to a binary address *///be sure to check length of string
if (line.size() < 12)
{
cerr << "line is too small" << endl;
continue;
}
string address = "";
string tmp_str = line.substr(4,8);
for (i = 0; i < tmp_str.size(); i++) //tmp_str.size() will always be 8
{
}
}
Других решений пока нет …