2015-04-13 2 views
0

Я нахожусь в вводном классе C++, поэтому я совершенно новичок в этом, но я, кажется, получаю segfault во время выполнения со следующим кодом (урезанный примерно до того места, где я думаю, что проблема):Получение segfault, работающего с массивами в C++

int main(int argc, char *argv[]) 
{ 
string filename; 
ifstream infile; 
float average; 
int const ARRAY_SIZE = 20; 
int count = 0; 
string responses[ARRAY_SIZE]; 
string response; 
char grade; 

welcome(); 
splash(); 

cout << showpoint << setprecision(1) << fixed; 

cout << "\n\n\n\n\n\n\n\n\n\n\n" 
    << "\t\tEnter 8-Ball response file name: "; 
cin >> filename; 

infile.open(filename.c_str()); 
system("CLS"); 
     cout << "score"; 
cout << "\n\n\n\n"; 

if (infile) 
    { 
     while (!infile.eof()) 
     { 
      infile >> response; 
      if (1==1) 
      { 
       responses[count] = response; 
       count ++; 
      } 

     } 
      infile.close(); 
    } 

cout << "\n\n\n"; 

system("PAUSE"); 
return 0; 
} 

там какие-то дополнительные строки, переменные и т.д. в там только потому, что это выброшенное вместе из различных старых программ, и я не включаю в себя функцию, потому что это не там, где проблема кажется быть. В принципе, всякий раз, когда я ввожу имя файла, я получаю segfault. Он печатает «счет», так что после этого момента я попытался извлечь часть if, но это все еще дало мне печаль, так что кажется, что проблема связана с кодом в инструкции while. Мы не перешли на segfaults в деталях, поэтому я даже не знаю, с чего начать поиск проблемы.

+2

'а' неверно, это должно быть 'while (infile >> response)'. Что произойдет, если ваш файл содержит более 20 ответов? Вместо жесткого кодирования массива для некоторого произвольного размера вы должны использовать 'std :: vector ', который расширяется по размеру по мере необходимости. Если это то, чему вас учат в вашем классе, это очень плохой класс, которого я боюсь. –

+0

Прошли ли вы с помощью отладчика, чтобы пройти через вашу программу, чтобы вы могли видеть, где произошла ошибка? Segfaults обычно исходят от неправильного использования указателей или записи за пределами массива. – Barmar

+0

@ neil-kirk Да, это то, чему нас учили. Этот учитель был немного шелушился о некоторых вещах, поэтому я не могу сказать, что я полностью потрясен, услышав, что мы узнали что-то не так. К счастью, осталось всего несколько недель. Похоже, первое предложение, которое вы сделали, это, в основном, замена, но что именно я делаю со вторым? – sagev9000

ответ

2

Размер жесткого кодированного массива, и есть ли вероятность, что он преодолеет этот предел?

Так что, если ваши ответы могут динамично расти, объявить вектор следующим

#include<vector> std::vector<std::string> responses;

И исправить петлю следующим образом: (! Infile.eof())

while (infile >> response;) 
    {   
     responses.emplace_back(response); 
     count ++;  

    } 
    infile.close(); 
+0

Спасибо за комплект. Должен ли я помещать «std ...» в соответствие с остальными моими переменными? Это дает мне ошибку: «vector» не является членом «std» Редактировать: О, и в этом случае количество ответов _is_, на самом деле, жестко запрограммировано. Определенно следовало бы упомянуть раньше. – sagev9000

+0

Если вы используете использование пространства имен std; уже я так полагаю, вам это не нужно. Но использование std :: string лучше, чем использование пространства имен std; – Steephen

+0

Чтобы устранить эту ошибку, вы должны добавить #include Я добавил в ответ – Steephen

Смежные вопросы