Загрузка большого текстового файла (более 50 000 строк, ~ 8 МБ) приводит к остановке моей программы?

Ответил:

изменения

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++)
{
....

0

Решение

Похоже, что одна из ваших строк может быть недостаточно длинной.

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
{
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]