C ++ Открытие файла и ввод данных в объект класса - PullRequest
0 голосов
/ 12 ноября 2008

Простой вопрос, надеюсь, легкий путь и просто хочу убедиться, что я делаю это правильно / эффективно.

У меня есть объект класса T, который обычно помещается в вектор, созданный в моей функции main (). Это могут быть любые данные, строки, int, float ... и т. Д. Я читаю из файла ... который вводится пользователем и передается в функцию. Вот мое основное прочтение в функции:

template <class T, class U>
void get_list(vector<T>& v, const char *inputFile, U)
{
ifstream myFile;
T object;

myFile.open("inputFile")
while(!myFile.eof())
   {
   myFile >> object;
   insert(v, object, U)
   }
}

insert - это еще одна функция, которая будет проходить и вставлять данные в мою структуру данных. Я просто хочу убедиться, что это лучший способ передать эти данные, если они вообще будут работать.

Ответы [ 3 ]

4 голосов
/ 12 ноября 2008

Вы допустили старую ошибку тестирования eof в условии. EOF не устанавливается, пока вы не попытаетесь прочитать за концом файла. Таким образом, этот метод вставит одно лишнее значение в вектор, который вам не нужен.

template <class T, class U>
void get_list(vector<T>& v, const char *inputFile, U)
{
    ifstream myFile("inputFile");  // Why hard code this?
                                   // When you pass inputFile as a parameter? 
    T object;


    while(myFile >> object)  // Get the object here.
                             // If it fails because of eof() or other
                             // It will not get inserted.
    {
         insert(v, object, U)
    }
}
1 голос
/ 12 ноября 2008

Не используйте .eof() в потоке в while -условии. Условие оценивается как истинное только после была предпринята попытка чтения после конца файла. лучший способ сделать

while(myFile >> object)
    insert(v, object, U);

Ваше использование U некорректно. Я понятия не имею, для чего это используется. Один раз он используется как тип, но затем в другой раз вы передаете его функции insert в качестве значения.

1 голос
/ 12 ноября 2008

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

...