我想用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
变量有关?)但我不知道是什么,因为我没经验。
你能告诉我我做错了什么吗?
答案 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;