2017-03-12 14 views
-6

私はC++でコーディングしており、後で特定の文字にアクセスしたいファイルを読み込もうとしています。同様に、ファイル内の任意の点にあるchar(行x、char y)は何ですか?C++グリッドのようなファイルを読み込みます。

改行文字を検索し、改行xを参照して行の長さを確認して、行の長さが与えられた位置にcharを引くことができるように、

良いアプローチであるかどうかわかりません。

+1

[ask]をご覧ください。 –

+1

ようこそスタックオーバーフローへ。 [The Tour](http://stackoverflow.com/tour)を読み、[ヘルプセンター](http://stackoverflow.com/help/asking)の資料を参考にしてください。ここに聞いてください。 –

答えて

-2

動作する限り。ファイル全体をメモリに読み込むことは、オプションであれば簡単になります。

+0

確かに、私は方法に精通していないが、私はそれを調べるだろう。ファイルがメモリに読み込まれると、特定の場所で文字にアクセスするより良い方法がありますか? – TestAccountPlsIgnore

+0

これはコメントだった可能性があります。 –

+0

質問はアプローチについてです。グリッドがそれほど大きくない場合は、すべてのベクトルをベクトルまたはその他の同様の構造体にロードするのが最も簡単です。インデックス作成も機能します。 –

-1

(行の文字の「LINENUM」とカラム「columnNum」)、これを試してみてください:

ifstream inf; 
inf.open(filename); //filename being c-string 

string str; 
for (int i = 0; i < lineNum; i++) 
{ 
    std::getline(inf, str); 
} 

この方法で「STR」店舗に興味があります行を(自動的に改行文字をチェックし、停止します)。 は、次に、あなたが使用することができます。

char chr = str[columnNum]; 

「CHR」変数にしたい文字を格納します。

inf.close(); 

残念ながら、私の知る限り、文字にアクセスするたびにこのプロセスを繰り返す必要があります。

+0

ありがとうございます。私もこのようなことを考えていましたが、あなたが言ったことをまったく避けることを望んでいましたが、コードで書かれているのがうれしいです。 – TestAccountPlsIgnore

-1
#include <iostream> 
#include <fstream> 
#include <vector> 
#include <string> 
#include <sstream> 

#define FILENAME "File.txt" 

class FileGrid { 
public: 
    typedef std::vector<std::string> Line; 
    typedef std::vector<std::string>::const_iterator LineIter; 

    typedef std::vector<std::vector<std::string>> StringMap; 
    typedef std::vector<std::vector<std::string>>::const_iterator StringMapIter; 


    void FillGrid(char* fileName) { 
     grid.clear(); 
     std::ifstream in(FILENAME, std::ifstream::in); 
     if (!in.is_open()) { 
      std::cout << "problem reading " << FILENAME << std::endl; 
      return; 
     } 

     std::string words; 
     std::string word; 
     std::stringbuf buffer; 

     while (in.is_open() && std::getline(in, words)) { 
      std::stringstream ss(words); 
      Line line; 
      while (ss >> word) { 
       line.push_back(word); 
      } 

      grid.push_back(line); 
     } 
    } 
    void PrintGrid() { 
     StringMapIter b = grid.begin(); 
     StringMapIter e = grid.end(); 

     std::cout << "\t\tFile Content:" << std::endl; 
     while(b != e) { 
      for (unsigned int i = 0; i < b->size(); ++i) { 
       std::cout << b->operator[](i) << " "; 
      } 
      std::cout << std::endl; 
      ++b; 
     } 
    } 

    char const & GetChar(int lineNo, int charNo) { 
     // LineNo checks etc 
     Line const & line = grid[lineNo]; 
     for(std::string const & word : line) { 
      if(charNo > word.size() + 1) { 
       charNo -= word.size() + 1; 
      } 
      else { 
       return word[charNo]; 
      } 
     } 

     throw std::exception("charNo higher"); 
    } 

private: 
    StringMap grid; 


}; 

void main() { 

    FileGrid grid; 
    grid.FillGrid(FILENAME); 
    grid.PrintGrid(); 

    std::cout << grid.GetChar(0, 3); // should return first line, 4th character 
} 

私が今までに書いたベストコードではありませんが、私が短時間でできることはかなりあります。

FileGridは、データの読み取りとアクセスを処理します。ファイルを1行ずつ読み込み、std::vectorに格納します。行の読み込みが終了すると、それは別のstd::vectorにプッシュされます。最後に、(一種の)2次元配列の文字列があります。

また、最高のコードではなく、間違いなく最も最適化されたコードではありませんが、アイデアは変わりません。ファイルから1行ずつ読み込み、各単語を区切って文字列にします。 STLを使用できない場合は、各行に対して2D配列を動的に作成することができますが、私はあなたの質問の特定の要件を知らないので、文字列のグリッドを格納する主な方法を示すために単純でブルートフォースを書きましたメモリに書き込む。

+0

ありがとうございます。私は特別な要件はありません、私はちょうどこのようなアイデアを探していた。 – TestAccountPlsIgnore

関連する問題