Домашняя работа C ++: параллельные массивы из текстового файла - PullRequest
1 голос
/ 24 февраля 2011

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

Jean Rousseau  
1001 15.50
Steve Woolston
1002 1423.20
Michele Rousseau
1005 52.75
Pete McBride
1007 500.32

Это имя в одной строке, затем номер идентификатора и остаток на следующей строке, разделенные пробелом.

ЭтоМоя функция для импорта данных:

void InputFromFile(string fileName, int sizes, string namesAr[],
int idsAr[], float balancesAr[])
{
// Variables
int indexCount;
ifstream inFile;

// Initialize
indexCount = 0;

inFile.open(fileName.c_str());

while(inFile && indexCount < sizes)
{
    getline(inFile, namesAr[indexCount]);
    inFile >> idsAr[indexCount];
    inFile.ignore(1000, '\n');
    inFile >> balancesAr[indexCount];
    inFile.ignore(1000, '\n');
    indexCount++;
}

inFile.close();
}

Это то, что добавляется в массив при выводе всех элементов ...

Жан Руссо
1001
0

-1
3.76467e-039

36
3.76457e-039

0
6,57115e-039

7736952
8.40779e-045

7736952
0

1 Ответ

7 голосов
/ 24 февраля 2011
inFile >> idsAr[indexCount];
inFile.ignore(1000, '\n');

Вы читаете первое число из строки, затем игнорируете все символы до конца строки, включая второе число.Затем вы пытаетесь прочитать следующее имя, как если бы оно было числом, и, поскольку вы не проверяете ошибки, все идет не так.

Этот ignore совершенно не нужен: нечего игнорировать междупервое и второе числа в виде >> будут пропускать любые пробелы в начале.Второй ignore необходим , так как вам нужно пропустить новую строку в конце строки чисел, прежде чем использовать getline, чтобы прочитать следующую строку имени.Возможно, вам будет проще использовать только getline для чтения данных из файла, а затем проанализировать строку чисел с помощью stringstream.Смешивание отформатированного извлечения (>>) с извлечением на основе строк может быть затруднено для правильного определения.

После любой операции ввода необходимо проверить состояние потока, чтобы убедиться, что ошибка не произошла.В качестве простого примера:

if (!(inFile >> idsAr[indexCount]) {
    /* input failed; handle error as appropriate */
}

Поток имеет несколько флагов состояния, а при сбое извлечения устанавливается флаг fail, который необходимо очистить перед продолжением использования потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...