文件阅读C ++课程

时间:2013-04-01 00:16:07

标签: c++ string segmentation-fault ifstream

我正在制作一个文件阅读课程。它应该在构造时打开具有给定字符串的文件并根据调用的构造函数使用提供的第二个字符串来跳过文件到给定字符串后的行。

这是我的代码:

SnakeFileReader::SnakeFileReader(string filePath)
{
    fileToRead_.open(filePath.c_str(), ios::in);
}
SnakeFileReader::SnakeFileReader(string filePath, string startString)
{
    fileToRead_.open(filePath.c_str(), ios::in);

    string toFind;

    while (toFind != startString  && !fileToRead_.eof())
    {
        fileToRead_ >> toFind;
    }
}
string SnakeFileReader::ReadLine()
{
    string fileLine;

    if (!fileToRead_.fail() && !fileToRead_.eof())
        fileToRead_ >> fileLine;

    return fileLine;
}
int SnakeFileReader::ReadInt()
{
    string fileLine = "";

    if (!fileToRead_.fail() && !fileToRead_.eof())
        fileToRead_ >> fileLine;

    int ret;

    istringstream(fileLine) >> ret;

    return ret;
}
SnakeFileReader::~SnakeFileReader()
{
    fileToRead_.close();
}

我遇到的问题是在第二个构造函数中我遇到了分段错误。一旦我声明了一个字符串,我就会在读取行函数中遇到另一个分段错误。

[编辑]这是请求的额外代码。作为我学位第一年的一部分,我正在制作一个“蛇游戏”。我希望游戏能够读取和保存文件而不是硬编码变量值。我将最终使用这个类来设置游戏中的关卡。但是这里有几行应该证明我打算如何使用这个类:

//Level.cpp
std::string fileToRead = "resources/files/level1.txt";
SnakeFileReader sfr(fileToRead);
std::string mapFilePath = sfr.ReadLine();
ImageFile(mapFilePath).load(map_layout);
mapWidth_ = sfr.ReadInt();
mapHeight_ = sfr.ReadInt();
level_cell_size_ = sfr.ReadInt();

map_ = new TileData*[mapWidth_];

for (int i = 0; i < mapWidth_; i++)
{
    map_[i] = new TileData[mapHeight_];
}

文件布局:

resources/images/Map1_Layout.bmp
40
30
20

班级声明:

#ifndef SNAKE_FILE_READER_HPP
#define SNAKE_FILE_READER_HPP

#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;
class SnakeFileReader
{
    public:
        SnakeFileReader(string filePath);
        SnakeFileReader(string filePath, string startString);
        ~SnakeFileReader();
        string ReadLine();
        int ReadInt();
    private:
        ifstream fileToRead_;
};
#endif // SNAKE_FILE_READER_HPP

2 个答案:

答案 0 :(得分:0)

我不确定你的构造函数,但ReadLine()的问题是你试图返回一个自动变量的内存地址,当你退出函数时它会被破坏。

最简单的解决方法是删除'&amp;'在返回值上,只返回一个字符串。但是如果你决定返回一个内存地址,那就试试吧:

string *SnakeFileReader::ReadLine()
{   
string *fileLine = new string;

if (!fileToRead_.fail() && !fileToRead_.eof())
    fileToRead_ >> *fileLine;

return fileLine;
}

这将动态分配字符串并传回指针。不同之处在于,当您离开其范围时,动态变量不会自动销毁。该字符串仍然存在于堆中,直到您自己删除它(在完成它时必须记住这一点)。

答案 1 :(得分:0)

在ReadLine函数中,您返回对函数堆栈上分配的变量的引用。你正在破坏堆栈,疯狂的事情可能发生。你的编译器应该警告过你。