问题阅读数据

时间:2011-10-17 22:05:30

标签: c++ fstream

我无法将文件中的数据读入类中的列表。似乎某个额外的十六进制值正在某处被拾取。

数据(我希望输出的样子) enter image description here

输出(随机包含额外的0x4463c4) enter image description here

以下是我认为相关的一些代码。任何人都可以告诉我我可能犯的错误吗?

数据从文件(主要)读入程序的位置:

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);
    }

orderedlist.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);
}

感谢任何帮助,如果需要澄清任何内容或者需要查看程序中的更多代码,请告诉我。谢谢!

2 个答案:

答案 0 :(得分:0)

您将结构对象传递给cout,后者不知道如何显示它们。您获得的十六进制值是结构对象地址。

答案 1 :(得分:0)

End of File in 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条件就会失败,并且会突然出现。