-3

所以我有这个问题我无法解决:-(在我的.h中我有这个:

protected:
   char* _textPath_1;
   FileReader* _reader_3;

在 .cpp 我有:

_reader_3 = new FileReader();
_textPath_1 = "foo";
_reader_3->openFile(_textPath_1);

FileReader 有这个:

private:
   char* fileName;
public:
   signed int openFile(char* name);

但如果我写这个(只是为了测试):

signed int FileReader::openFile(char* name) {
    std::cout << name << std::endl;
    fileName = name;
    stream.open(fileName, std::ios::in);
    if (!stream.is_open()) {
        FileReader::printErrorOpeningFile(fileName);
        stream.close();
        return -1;
    }
   return 0;
}

fileName 是一个 char *,我需要它获得相同的名称值(foo)。我收到一个错误,我什至无法打印名称,它只是打印一个空行.. 为什么?

编辑:即使使用 strcpy 也无法正常工作。实际上在函数内部我无法打印名称的值,就像它已被“取消初始化”

4

3 回答 3

1

您需要为您的文本字符串分配空间_textPath_1。试试这个。

char myTextString[] = "foo";
_textPath_1 = myTextString;

这将创建一个本地字符数组(字符串),它被初始化为"foo\0". 然后它将该字符串的地址复制到您的 char 指针_textPath_1。作为LOCAL存储,它只会在本地代码块中有效,一旦您的代码超出其范围,它将无法使用。如果您需要该字符串通过本地代码块,则需要从堆内存中分配它(new例如使用),并记住在完成后释放它。

您不能strcpy与未分配的指针一起使用,因为strcpy期望目标char*指向充当目标字符串缓冲区的字符数组。由于您根本没有分配任何字符空间,因此它无法复制"foo"到您_textPath_1strcpy.

这些和其他乐趣char*是为什么std::string被发明的。不用担心分配和释放空间,必须使用 strcpy 来复制它的值等等等等。考虑使用std::string _textPath_1代替你的char* _textPath_1.

于 2012-07-27T17:45:30.903 回答
0

您必须在调用函数之前分配 _reader_3。

FileReader* _reader_3 = 新的 FileReader;

我假设 fileName 是您的成员变量。在没有初始化的情况下访问指针会导致不可预知的结果

于 2012-07-27T16:58:00.320 回答
0

如果您真的在头文件中定义全局变量:

char* _textPath_1;
FileReader* _reader_3;

那你不应该那样做。全局变量应该在头文件中声明,但在实现文件中定义。


此代码工作正常:

#include <iostream>
#include <fstream>

struct FileReader {
    char* fileName;
    std::fstream stream;

    signed int FileReader::openFile(char* name) {
        std::cout << name << std::endl;
        fileName = name;
        stream.open(fileName, std::ios::in);
        if (!stream.is_open()) {
            FileReader::printErrorOpeningFile(fileName);
            stream.close();
            return -1;
        }
        return 0;
    }

    void printErrorOpeningFile(char *) {}
};

int main() {
    char* _textPath_1;
    FileReader* _reader_3;

    _reader_3 = new FileReader();
    _textPath_1 = "foo";
    _reader_3->openFile(_textPath_1);
    delete _reader_3;
}
于 2012-07-27T17:02:25.130 回答