2016-09-26 6 views
0

То, что я пытаюсь сделать, читается числами из текстового файла (в настоящее время называемого «input»). Я создаю два массива: один для числа int и один для числа с плавающей точкой. Максимальное количество элементов в массиве устанавливается равным 50, однако минимум равен 1. Идентификатор программы для остановки чтения чисел - это любое отрицательное число в значении int.Чтение в Numbers, но Stop at Negative C++

Я не уверен, почему, но когда я читаю назад, мой массив печатает цифры, пропускает окончательное отрицательное число, а затем выводит значения тарабарщины для оставшихся слотов (до 50).

Любые советы будут оценены.

void Read(ifstream &input, int studentID[], float score[]) 
{ 
    int curID; 
    float curScore; 
    for (int i = 0; i < 50; i++) 
    { 
     input >> curID >> curScore; 
     if (curID < 0) 
     { 
      return; 
     } 
     else 
     { 
      studentID[i] = curID; 
      score[i] = curScore; 
     } 
    } 
} 
+1

Я предполагаю, что вы попытались напечатать массив от 1 до 50 без проверки предела максимального индекса элемента чтения. Таким образом, вы должны поддерживать общее количество элементов, считанных и распечатанных в соответствии с этим общим количеством. –

+0

Вы правы. Я сам это осознал. Я распечатывал 50 значений без проверки длины моего массива. Не могли бы вы отправить ответ в ответ, чтобы я мог дать вам кредит? –

ответ

0

Исправьте код

int Read(ifstream & input, int studentID[], float score[]) 
{ 
    int curID, i = 0; 
    float curScore; 
    while (i < 50) { 
     input >> curID >> curScore; 
     if (curID < 0) 
      break; 
     else { 
      studentID[i] = curID; 
      score[i++] = curScore; 
     } 
    } 
    return i; // This value will be useful while printing the contents 
} 

Чтобы избежать выхода тарабарщину, только итерацию, пока вы успешно прочитан, то есть возвращение Read(...) метода.

1
if (curID < 0) 
{ 
    return; 
} 

Это потому, что если вы столкнулись с отрицательным числом, ваш алгоритм не сохраняет, что отрицательное число в studentID[i].

В результате studentID по-прежнему содержит неинициализированные значения с первой недопустимой позиции. Без присутствия магического маркера, и никакой счетчик не прошел обратно, вы не можете восстановить конец ввода.