0

我有一个文本文件,其中仅包含带有以下消息的行:

你好
你好

现在我得到了这个函数,它读取这些行并返回一个包含它们的数组。

string* printlines(string filename)
{
string line;
int sum = 2;
int i =0;
string *quotes;
ifstream infile(filename.c_str());

quotes= new string[2];

    if (infile.is_open())
    {

      while (infile.good())
      { 
        getline (infile,line);
        quotes[i] = line; // <--- here's the problem
        i++;
       }
    }
infile.close();
return quotes;
}

gdb 报告粗体行有问题,但我没有看到。

4

2 回答 2

2

如果您阅读的行数超过两行,您就会在堆上分配两个字符串。如果你想返回一个动态分配的字符串数组,可以使用std::vector类似这样的东西:

std::vector<std::string> printlines(const std::string& filename)
{
    std::vector<std::string> quotes;
    std::ifstream infile(filename.c_str());

    if (infile.is_open())
    {
        while (infile.good())
        {
            std::string line;
            std::getline (infile,line);
            quotes.push_back(line);
        }
    }
    infile.close();

    return quotes;
}

这样,您无需关心读取了多少字符串,它只会不断增长,为所有字符串腾出空间,您无需担心内存泄漏,当向量超出范围时,它将删除所有字符串。

于 2012-05-11T15:35:07.383 回答
2

循环结构不正确,将导致超出数组末尾。即使文件中只有两行,也不会立即检查getline()以确定是否成功。将读取前两行,但尚未设置 eof ,从而导致第三次getline()调用,超出数组的末尾。

改成:

while (getline(infile, line) && i < 2)
{
    quotes[i] = line;
    i++;
}

话虽如此,考虑使用 astd::vector<std::string>而不是数组:

std::vector<std::string> quotes;
while (getline(infile, line))
{
    quotes.push_back(line);
}

std::vector动态增长以存储所有读取的行。无需更改代码即可将新行添加到文本文件中。

于 2012-05-11T15:35:24.823 回答