-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 * であり、name と同じ値 (foo) を取得する必要があります。エラーが発生し、名前を印刷することさえできず、空白行が印刷されるだけです..なぜですか?

編集: strcpy を使用しても機能しません..実際には関数内で name の値を出力できません。「初期化解除」されているようです。

4

3 に答える 3

1

テキスト文字列にスペースを割り当てる必要があります_textPath_1。代わりにこれを試してください。

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

これにより、 に初期化されるローカル文字配列 (文字列) が作成され"foo\0"ます。次に、その文字列のアドレスを char ポインターにコピーします_textPath_1ローカルストレージとしては、ローカル コード ブロックでのみ有効であり、コードがスコープから外れると使用できなくなります。その文字列がローカル コード ブロックを超えて必要な場合は、(newたとえば使用して) ヒープ メモリから文字列を割り当て、作業が終わったら忘れずに割り当てを解除する必要があります。

宛先が宛先文字列バッファーとして機能する文字配列を指していると予想されるstrcpyため、未割り当てポインターでは使用できません。char スペースをまったく割り当てていないため、にコピーできません。そのため、コピーしようとすると実行時エラーが発生します。strcpychar*"foo"_textPath_1strcpy

これらと他の楽しみが発明されたchar*理由です。std::stringスペースの割り当てと割り当て解除、strcpy を使用してその値をコピーする必要などについて心配する必要はありませstd::string _textPath_1char* _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 に答える