Использование Ifstream для добавления чисел из текстового файла в массив стилей C - PullRequest
2 голосов
/ 19 апреля 2011

У меня проблемы с названием выше.Я пробовал следующее, но оно не работает в правильном режиме.

void ArrayIntStorage::read(ifstream& in)
{
    if(in.is_open())
    {
        while(!in.eof())
        {
            in.getline(arrayStorage, sizeof(in));
        }
    }
}

ofstream& ArrayIntStorage::write(ofstream &out) const
{
    for (int i = 0; i < sizeof arrayStorage; i++)
    {
        out << arrayStorage[i] << endl;
    }
    return out;
}

Я новичок в программировании на C ++, поэтому я, вероятно, делаю что-то глупое.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 19 апреля 2011

Я собираюсь догадаться, что вы читаете / пишете массив целых чисел.Похоже, что вы неправильно читаете sizeof (in), а не sizeof (arrayStorage) в вашем методе чтения.

0 голосов
/ 19 апреля 2011

Есть несколько проблем с вашим кодом. Для начала, вы не показывайте нам объявление arrayStorage, поэтому мы должны угадай это: я угадаю int arrayStorage[N], (где N константа). После этого для чтения:

  • Никогда не правильно использовать `istream :: eof` в цикле. это функция имеет значение только после сбоя ввода; до что он может вернуть `false`, когда нет ничего другого читать, и `true`, хотя последний ввод прошел успешно. Вы интересуетесь функцией `fail`, а это то, что вызывается косвенно всякий раз, когда `istream` используется в контекст, который требует `bool`.
  • `getline` требует` char [] `и читает символы, а не ИНТ-х.

Если все файлы содержат эти int, стандартная идиома для чтения их будет:

for (int i = 0; in && i < N; ++ i) {
    in >> arrayStorage[i];
}

На практике вы, вероятно, захотите немного больше: это ошибка, если файл не содержит достаточно int? если он содержит слишком много? И вы захотите проверить после сбоя, что сбой был из-за конца файла, а не какой-то случайной тарабарщины в файл. Или, может быть, вы хотите (или нужно) проверить формат больше, обеспечение того, чтобы в строке никогда не было более одного целого.

Ваша функция вывода выглядит почти нормально; последний индекс должен быть N, а не sizeof arrayStorage (который возвращает количество байтов в массиве, а не количество элементов). Позже, вниз по течению, Вы хотите проверить, что не было ошибок после закрытие файла; нет ничего более расстраивающего, чем программа, которая говорит, что это удалось, когда на самом деле только часть данные попали на диск.

...