在C+中运行时创建多个数量不确定的链表+; 我是C++的新手。我目前正在执行一项任务,要求我读取一个文件,将每一行存储到一个链接列表中,然后将所有链接列表存储到一个链接列表中。总之,我需要创建一个行的链表,每一行都包含字符的链表

在C+中运行时创建多个数量不确定的链表+; 我是C++的新手。我目前正在执行一项任务,要求我读取一个文件,将每一行存储到一个链接列表中,然后将所有链接列表存储到一个链接列表中。总之,我需要创建一个行的链表,每一行都包含字符的链表,c++,list,C++,List,我在这里呆了很长一段时间。因为程序将由具有不同行数的文件进行测试。所以我认为我应该根据实际行数创建多个链表。然而,我目前的解决方案无法实现这一点 下面是我的loadFile方法 void loadFile(list< <list<char> > &rows, const string &file) { list<char> elements; char ch; ifstream fin; fin.o

我在这里呆了很长一段时间。因为程序将由具有不同行数的文件进行测试。所以我认为我应该根据实际行数创建多个链表。然而,我目前的解决方案无法实现这一点

下面是我的loadFile方法

void loadFile(list< <list<char> > &rows, const string &file)
{
     list<char> elements;
     char ch;
     ifstream fin;
     fin.open(file.c_str());
     while(!fin.eof()){
          while(fin.get(ch))
          {
              if(ch != '\n')
               {
                    elements.push_back(ch);
               }
           rows.push_back(elements);
          }
      }
      fin.close();
}
void加载文件(列表<&行、常量字符串和文件)
{
列出要素;
char ch;
流鳍;
打开(file.c_str());
而(!fin.eof()){
while(fin.get(ch))
{
如果(ch!='\n')
{
元素。推回(ch);
}
行。推回(元素);
}
}
fin.close();
}
显然,这个方法并没有达到我应该做的。所以我想知道,我是否可以根据文件中的行数创建尽可能多的链表,并将所有链表推到行链表中?或者有人能告诉我其他的解决方案吗?(文件必须存储到链表中,这意味着我们不能使用数组等。)
提前感谢您的帮助。

当遇到
\n
时,需要修改内部
while
循环以清理
元素

while(fin.get(ch))
{
  if(ch != '\n')
  {
    elements.push_back(ch);
  }
  else
  {
    rows.push_back(elements);
    elements.clear();
  }
}

我觉得其他一切都不错。

考虑使用字符串,而不是单独存储每个字符

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

int main()
{
  std::list<std::string> lines;
  std::string line;

  while (getline(std::cin, line))
    lines.push_back(line);
}

使用
std::getline
可以更简单地编写代码。比如说

void loadFile( std::list<std::list<char>> &rows, const std::string &file )
{
     std::ifstream fin( file );
     // or std::ifstream fin( file.c_str() );

     std::string record;
     while ( std::getline( fin, record ) )
     {
          rows.push_back( std::list<char>( record.begin(), record.end() ) );
     }
}
void加载文件(std::list&rows,const std::string&file)
{
std::ifstream fin(文件);
//或者std::ifstream fin(file.c_str());
字符串记录;
while(std::getline(fin,record))
{
rows.push_back(std::list(record.begin(),record.end());
}
}

考虑到在一般情况下,某些行可能是空的。您可以从处理中排除这些行。

您确定您的作业允许您使用STL列表吗?通常当提到链表时,你应该自己实现它们。是的,我知道你的意思。这就是为什么我在互联网上找到的所有解决方案都是关于操纵链表的。这是我们的第一个C++任务,所以我们现在可以使用STL LISTIt了。非常感谢你。这确实有助于我理解链表的工作原理:)谢谢你们的快速回复。这是否意味着(!fin.eof())和(!fin.get(ch))正在做相同的事情,所以我不应该这样做?
而(!fin.eof())
只检查是否已到达文件结尾,如果文件读取因任何其他原因失败(例如,如果您尝试从字母文本中提取整数),您将陷入无限循环<代码>while(fin.get(ch))
将检查流中的任何错误,包括
eof
(通过流
fail()
方法),而在代码中(!fin.eof())不仅是不必要的,而且可能是灾难性的。看一看链接的问题。这是考虑周到的。再次感谢您提供的有用提示:)谢谢。是的,我以前使用过getline(),它更简单。只是我们需要将文件存储在字符的链表中。您的解决方案很好。@user3226289使用该解决方案,您将有一个字符列表。哦,我忽略了push_back()中的列表。这是一个聪明的方法。
void loadFile( std::list<std::list<char>> &rows, const std::string &file )
{
     std::ifstream fin( file );
     // or std::ifstream fin( file.c_str() );

     std::string record;
     while ( std::getline( fin, record ) )
     {
          rows.push_back( std::list<char>( record.begin(), record.end() ) );
     }
}