无法输出链表的内容

时间:2014-05-23 12:36:55

标签: c++ stl linked-list

我想用linked list填充文本文件的内容。

为了实现这一点,我创建了一个结构,用于保存文件中一行的数据。

然后我会简单地浏览文件中的行,并在链接的list中添加填充的结构。

似乎我已设法正确填充列表但我无法显示其内容。

这是我到目前为止所做的:

Person.h

#ifndef _Person_h_
#define _Person_h_

#include <iostream>
#include <list>
#include <fstream>
#include <string>

class Lista
{
private:
    struct Person
    {
        std::string lastName;
        std::string firstName;
        // other fields ommited for brewity

        Person( const char *lName = "", const char *fName = "" )
        {
            lastName += lName;
            firstName += fName;
        }

        ~Person()
        {
            lastName.clear();
            firstName.clear();
        }
    };

    // my linked list of Persons
    std::list<Person> persons;

public:
    // data comes from a comma delimited file 
    Lista( const char *inputFile, int maxTextLength = 100, char delim = ',' )
    {   
        std::ifstream g;
        g.open(inputFile);

        if( g.is_open() )
        {
            std::string temp( maxTextLength, 0 );

            while( !g.eof() )
            {
                Person p;

                // fill Person structure
                g.getline( &p.lastName[0], maxTextLength, delim );
                g.getline( &p.firstName[0], maxTextLength, delim );

                // add it to the list
                persons.push_back(p);
            }
            g.close();
        }
    }

    // testing function- > it should just display the content of the list
    void print()const
    {
        std::list<Person>::const_iterator it;

        for( it = persons.begin(); it != persons.end(); ++it )
        {
            std::cout << "L: " << it->lastName.c_str() << std::endl
                << "F: " << it->firstName.c_str() << std::endl << std::endl;
        }
    }

    // emty list
    ~Lista(){ persons.clear(); }
};

#endif

我已经决定停在这里并测试所做的事情,所以我在我的主要部门调用了print()函数:

的main.cpp

#include "Person.h"

int main()
{
    Lista p( "test comma separated file.txt", 100, ',' );

    p.print();

    return 0;
}

编译器报告没有错误,但是当我运行我的测试程序时,我得到了这个:

L:
F:

L:
F:

Press any key to continue...

如果我在cout构造函数中添加Lista,它会正确输出名称。看来我在构造函数中做错了(也许它与堆栈上的临时Person变量有关?)但我不知道是什么,因为我没经验。

你能告诉我我做错了什么吗?

2 个答案:

答案 0 :(得分:0)

Person( const char *lName = "", const char *fName = "" )
    {
        lastName += lName;
        firstName += fName;
    }

不确定,但在c ++中,你能用这个参数吗? :

const char *lName = ""

我理解你想要的东西(默认值),但它将值设置为&#34;&#34;。 试试没有它。

答案 1 :(得分:0)

您需要一个缓冲区才能读取。你所做的是创建长度为1个字节的lastName字符串,并在其中读取maxTextLength个字节。

//create temporary buffers
char* buffFirstName = new char[maxTextLength];
char* buffLastName = new char[maxTextLength];
while( !g.eof() )
{
    //read into temporary buffers
    g.getline( &buffFirstName[0], maxTextLength, delim );
    g.getline( &buffLastName[0], maxTextLength, delim );
    //create person data
    Person p(buffFirstName, buffLastName);
    // add it to the list
    persons.push_back(p);
}
//release the buffers
delete[] buffFirstName;
delete[] buffLastName;