1

申し訳ありませんが、私は C++ 初心者です! 私は解決策を探しましたが、私のニーズに最も適したものを見つけることができません。txt ファイルの幅 (行内の文字の最大量) と高さ (ファイルあたりの行の最大量) を読み取ろうとしています。変数を使用して、動的サイズの txt ファイル/レベルを作成することを計画しています。

これより前に、幅と高さを固定していました。

TXT ファイル: 部屋のレイアウトの文字の単純な出力 (スペース = 床、# = 壁、X = ドア):

########
#      #
#      X
#      #
########

問題: これは単純な問題だと思っていましたが、ループを破る前に各変数 (hNum、wNum) を 2 つしか読み取らず、プログラムを続行できません。

-私は何を間違っていますか?

-何とかseekgまたは別のループを使用する必要がありますか?

-ベクターを 2D ベクターに変更する必要がありますか?

-これを達成するための最良の方法はどれですか?

ルーム.cpp

//LOAD CURRENT ROOM FROM FILE

ss << RoomNo;
string str = ss.str();

    string fname = ("Room");
fname.append(str);
fname.append(".txt");
infile.open(fname);

infile.clear();
infile.seekg(0);

if(infile.is_open())
{
    // Sets width and height depndant on txt file size

    string line;

   //NOT WORKING!

    while( !infile.eof())
    {
        hNum++;
        getline ( infile, line);
        wNum += line.length();
        break;
    }
    height=hNum;
    width=wNum;

    //END

    // Loop to end of file- to get you all the lines from txt file.
    while(!infile.eof())        
    {
        int i;
        for(int row = 0; row < width; row++)
        {
            infile.getline(RoomFile, 256);
            i = 0;
            for(int col = 0; col < height; col++)
            {
                data.push_back(RoomFile[i]);
                i++;
            }
        }

    }
}
else
{
    cout << "ERROR: infile not open" << endl; 
}
infile.close();

アップデート

これは私が得たもので、スカイが提案したことをしようとしています...しかし、うまくいきません。次に進み、ループがアクティブではないと考えたので、引数を変更しました。ランタイムエラーが発生しました!

問題: 式: ベクトル添字が範囲外です!

提案は誰ですか?

            string line;

    while(getline(infile,line))
    {
        getline(infile, line);
        tempVector.push_back(line);
    }
    width=line.length();
    height=tempVector.size();
4

1 に答える 1

0

機能する可能性のある方法は、文字列のベクトルを作成し、ファイル全体を読み取り、各行をベクトル内の文字列にすることです。

大まかな例:

#include <vector>
#include <string>
#include <fstream>

/* ... */

vector<string> content;
string buffer;
while(!infile.eof())
{
  getline(infile, &string, '/n');
  content.push_back(string);
}

width = findMaxLengthOfStrings(content);
height = content.size();

ファイルの各行を個別の文字列として読み取っています。文字列はベクトルにプッシュされます。を使用してベクトルを反復処理することにより、ベクトル内のどの文字列が最も長いかを簡単に見つけることができますsize()。ファイルの行単位の長さはsize()、ベクター自体で取得されます。

また、コードの関連部分である I/O 関数だけを掲載することも役に立ちました。ただ言っている;)小さな画面サイズなど。

于 2013-03-17T15:15:29.693 に答える