从文本文件中存储行到字符串列表中

3

我一直在尝试将文本文件的每行存储到C++的列表中。更好的方法是,我一直在尝试将文本文件每行的每个单词存储在字符串列表中的一个字符串中,但似乎我的方法不正确。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <list>

using namespace std;

int main()
{
  FILE *f= fopen("teste.txt", "r");
  size_t len= 100; // valor arbitrário
  char *line= (char*)malloc(len);
  std::list<string> mylist;   


if (!f)
  {
    perror("teste.txt");
    exit(1);
  }
  while (getline(&line, &len, f) > 0)
  {    //THE REAL PROBLEM
  for (std::list<string>::iterator it = mylist.begin(); it != mylist.end(); it++){
    *it=line;     
    cout << *it << '\n';
}
  }
  if (line)
    free(line);
  fclose(f);
  return 0;
}

确切的问题是这个没有给出任何结果。编译成功了,但是没有任何结果显示。 提前感谢。

确切的问题是什么?编译器错误,奇怪的行为...?为什么要使用 *for :o - deviantfan
“@deviantfan '确切的问题是什么?' 它无法编译(http://ideone.com/5ytDea),即使修复了`*for`也不行。” - πάντα ῥεῖ
第27行是另一个奇怪的星星。 - deviantfan
我改了那个,但情况并没有变得更好。 - Uaga
2个回答

2

将您的while循环更改如下:

  while (getline(&line, &len, f) > 0)
  {
      mylist.push_back(line);     
      cout << mylist.back() << '\n';
  }

您不能访问未初始化的std::list<>中的任何项。

另外请注意,您应该将line设置为std::string,并从代码中省略malloc()/free()调用。

第二个注意事项:使用std::ifstream代替FILE*作为输入文件流。

这是完全修复的(在ideone上不再有错误/异常)代码示例:

#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <exception>
#include <errno.h>
#include <stdlib.h>

int main()
{
  try
  {
    std::ifstream f("teste.txt");

    if(!f)
    {
        std::cerr << "ERROR: Cannot open 'teste.txt'!" << std::endl;
        exit(1);
    }
    std::string line;
    std::list<std::string> mylist;   

    while (std::getline(f,line))
    {
        mylist.push_back(line);     
        std::cout << mylist.back() << std::endl;
    }
  }
  catch(const std::exception& ex)
  {
    std::cerr << "Exception: '" << ex.what() << "'!" << std::endl;
    exit(1);
  }

  exit(0);
}

@deviantfan 谢谢,已修复。 - πάντα ῥεῖ
非常感谢您的帮助。 - Uaga

1
您不能使用“=”运算符将char*值分配给std::string
*it=line 更改为 it->assign(line,line+strlen(line));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接