проблема чтения данных

У меня проблемы с чтением данных из файла в список в классе. Похоже, что где-то подбирается лишнее шестнадцатеричное значение.

Данные: (как я хочу, чтобы вывод выглядел) введите описание изображения здесь

Вывод: (дополнительный 0x4463c4 включается случайным образом) введите описание изображения здесь

Вот небольшой код, который я считаю актуальным. Может ли кто-нибудь сообщить мне об ошибках, которые я мог допустить?

Где данные считываются в программу из файла (основного):

struct filmType
{
     char number[6];
     char copy;
     char title[31];
     char rent_id[5];
     char rent_date[9];
     char return_date[9];
};


orderedList <filmType> orderedList;
    filmType newItem;

    //start of struct record
    filmFile.open("films.txt", ios::in);
    filmFile >> numFilm;
    filmFile.get();

    while (!filmFile.eof())
    {
         filmData.copy = filmFile.get();
         readString(filmFile, newItem.title,30);
         readString(filmFile, newItem.rent_id,4);
         readString(filmFile, newItem.rent_date,8);
         readString(filmFile, newItem.return_date,8);
         filmFile.get();

         orderedList.insert (newItem);

         readString(filmFile, filmData.number,5);
    }

Функция orderlist.insert: (заполняет список в классе)

void orderedList<elemType>::insert(const elemType& newItem)
{
     int index = length - 1;
     bool found = false;

     if (length == MAX_LIST)
         throw string ("List full - no insertion");

         // index of rear is current value of length

     while (! found && index >= 0)
        if (newItem < list[index])
        {
            list[index + 1] = list [index];  // move item down
            --index;
        }
        else
            found = true;

     list [index + 1] = newItem;  // insert new item
     ++length;
}

Функция Orderedlist.display: (выводит список на консоль)

void orderedList<elemType>::display() const
{
    int index;

    if (length == 0)
        throw string ("List empty");

    for (index = 0; index < length; ++ index)
        cout << list[index] << endl;
}

readString:

void readString (fstream & inFile, char * string, int length)
{
    inFile.get (string, length + 1);
}

Любая помощь приветствуется, дайте мне знать, если что-то нужно уточнить или нужно увидеть больше кода из программы. Спасибо!


person darko    schedule 17.10.2011    source источник
comment
Вы не думаете, что readString имеет отношение к делу?   -  person K-ballo    schedule 18.10.2011
comment
Очевидно, у вас сложная программа, и вы осознали, что она слишком сложна для публикации целиком. Вместо того, чтобы публиковать фрагменты большой программы, как насчет публикации всей меньшей программы? Пожалуйста, уменьшите размер вашей программы до минимального размера, который компилирует, запускает и показывает вашу ошибку. См. sscce.org для получения дополнительной информации об этой технике отладки.   -  person Robᵩ    schedule 18.10.2011
comment
В качестве альтернативы выполните пошаговое выполнение программы в отладчике. Остановитесь после каждой операции ввода файла и проверьте введенные данные. Где ваша программа в первую очередь отличается от ваших ожиданий?   -  person Robᵩ    schedule 18.10.2011
comment
Это не совсем очевидно из кода, попробуйте сократить его и проверять каждый шаг. UnitTest ++ - отличный фреймворк для такого рода проектов. И из любви ко всему священному не бросайте струны. Киньте то, что унаследовано от std::exception. std::logic_error или std::runtime_error - очевидные кандидаты.   -  person Tom Kerr    schedule 18.10.2011


Ответы (2)


Вы передаете объекты структуры в cout, который не знает, как их отображать. Полученные вами шестнадцатеричные значения - это адреса ваших структурных объектов.

person Marc Plano-Lesay    schedule 17.10.2011
comment
Если бы оператор ‹< не был перегружен, программа даже не скомпилировалась бы. Ваше предположение неверно. - person FailedDev; 18.10.2011
comment
Я думал, что перегрузка ‹< решила эту проблему. Я сделал это в своем заголовке: ostream & operator ‹< (ostream & out, const filmType & a) {out ‹< a.number ‹<< out ‹< a.copy ‹< ‹< out ‹< a.title ‹ ‹‹< из‹ вернуться; } (извините, а как отформатировать код в комментариях?) - person darko; 18.10.2011
comment
Ой, я думал, что компилятор будет отображать адрес памяти, как с указателями. Тогда проблема, вероятно, в его реализации operator<< - person Marc Plano-Lesay; 18.10.2011
comment
Вот и все. Удалите все свои out, кроме первого. - person Marc Plano-Lesay; 18.10.2011
comment
@mwmnj Не зная, как выглядит filmType, мы не можем определить вашу проблему, однако ваша проблема определенно находится здесь. Проверьте, что вы печатаете, мне кажется, вы печатаете адрес чего-то. - person FailedDev; 18.10.2011
comment
Пожалуйста. Кстати, вы можете отображать код с обратными кавычками в комментариях. - person Marc Plano-Lesay; 18.10.2011

Конец файла в C ++

.eof() не вернет true до тех пор, пока после чтения не произойдет. Что означает для последнего цикла:

while (!filmFile.eof())  //last read worked ok!  
{
     filmData.copy = filmFile.get();  //oh, reached end now.  read in nothing

Это означает, что остальная часть этого цикла неверна. Обычно картина такая:

filmFile.open("films.txt", ios::in);
while (readString(filmFile, filmData.number,5)) {
    filmFile.get(filmData.copy)
    readString(filmFile, newItem.title,30);
    readString(filmFile, newItem.rent_id,4);
    readString(filmFile, newItem.rent_date,8);
    readString(filmFile, newItem.return_date,8);
    filmFile.get();

    if (filmFile) //make sure there weren't errors
        orderedList.insert (newItem);
};
fstream& readString (fstream & inFile, char * string, int length)
{
    return inFile.get (string, length + 1);
}

Это означает, что как только чтение не удается (из eof), условие while не выполняется и выходит из цикла.

person Mooing Duck    schedule 17.10.2011