2011-10-19 12 views
4

と私はテキストファイルを持っている、それは多少のようにフォーマットされます。読み込むテキストファイル、未知の行の長さ

1 3 4 5 6 
6 7 8 
4 12 16 17 18 19 20 
20 
0 

ライン1〜10000の整数を含めることができます。私がしなければならないことは、すべて一行ずつ読むことです。このような

擬似コード:

line=0; 
i=0; 
while(!file.eof()){ 
while(!endLine){ 

array[0][i++]=file.readChar(); 
} 
line++;i=0; 
} 

だから、私はすべての行を読みたいれる配列を、持っている、とそれぞれの行は、これらの整数のそれぞれで構成されます。

私が抱えている問題は、行末が来たかどうかを確認する方法です。

文字列は使用できません。

はい、これは宿題ですが、割り当ての主なタスクはツリーを作成してから変換することです。私はそれをすることができますが、ファイルから整数を読み取る方法はわかりません。

+0

をあなたは文字列を使用することを許可されていない理由を割り当ての主なタスクは、ツリーを構築している場合は –

+0

を?講師は何かを喫煙しています。私は絶対に試してみたいと思います。 –

答えて

4

おそらく何か:

INTを読んだ後、私は手動でスペース、タブ、キャリッジリターンとラインの終わりをスキップするには(この1のために、あなたのロジックを実装する必要があります)。 intを読むには、私はifstreamのC++関数を使って直接読みました。私は文字でそれを文字を読んで、私はスペース」として\rをスキップ 注:-)それを文字列として再構成しないでください。私のために、行の最後が\nある。

#include <iostream> 
#include <fstream> 
#include <vector> 

int main() 
{ 
    std::ifstream file("example.txt"); 

    std::vector<std::vector<int>> ints; 

    bool insertNewLine = true; 

    int oneInt; 

    //The good() here is used to check the status of 
    //the opening of file and for the failures of 
    //peek() and read() (used later to skip characters). 
    while (file.good() && file >> oneInt) 
    { 
     if (insertNewLine) 
     { 
      std::vector<int> vc; 
      ints.push_back(vc); 

      //With C++11 you can do this instead of the push_back 
      //ints.emplace_back(std::vector<int>()); 

      insertNewLine = false; 
     } 

     ints.back().push_back(oneInt); 

     std::cout << oneInt << " "; 

     int ch; 

     while ((ch = file.peek()) != std::char_traits<char>::eof()) 
     { 
      if (ch == ' '|| ch == '\t' || ch == '\r' || ch == '\n') 
      { 
       char ch2; 

       if (!file.read(&ch2, 1)) 
       { 
        break; 
       } 

       if (ch == '\n' && !insertNewLine) 
       { 
        std::cout << std::endl; 
        insertNewLine = true; 
       } 
      } 
      else 
      { 
       break; 
      } 
     } 
    } 

    //Here we should probably check if we exited for eof (good) 
    //or for other file errors (bad! bad! bad!) 

    return 0; 
} 
+0

はい!これはまさに私が必要なものです。ありがとうございました! –

+0

構造の点で 'C++'よりも 'C'答えが多い(std :: ifstreamをFILE *に簡単に置き換えることができます) - 構文解析ロジックとツリー構築ロジックをクラスにカプセル化して、本当にC++にする必要があります。 – Skizz

+1

'while(!myfile.eof())'非常に、非常に悪い!!理由をSOに検索してください。 – Xeo

2

行全体を読み取るgetline()という関数があります。 Link

+0

OPは '注記、私は文字列を使用できません。 ' – Skizz

+0

getline()関数は文字列ではなくchar *を返します。 – v01d

+0

@Skizz: 'std :: string'を' getline() 'と一緒に使う必要があると誰が言っていましたか?あなたがリンクをたどると答えが 'istream :: getline'を参照していることがわかります。普通の' char * 'と大きさの文字を使ってください。 –

0

あなたは、ファイルから値を読み取るための機能を必要とするか、ファイルの状態の行または最後の終わりを示す、のようなもの:

result_type GetNextValue (input_file, &value) 
{ 
    if next thing in file is a number, set value and return number_type 
    if next thing in file is an end of line, return end_of_line_type 
    if end of file found, return end_of_file_type 
} 

してから、アレイの建物ループは次のようになります。

line = 0 
item = 0 
eof = false 

while (!eof) 
{ 
    switch (GetNextValue (input_file, value)) 
    { 
    case value_type: 
    array [line][item++] = value 

    case end_of_line_type: 
    line++; 
    item = 0; 

    case end_of_file_type: 
    eof = true 
    } 
} 

私は宿題のようにあなたに詳細を残します。このような

+0

はい、ただし、行末が来た場合はどうすれば確認できますか? 'ファイル内の次のものが行の終わりであれば、end_of_line_type'を返します。これはどうすれば確認できますか? –

+0

@ JanisPeisenieks:一度に1文字ずつファイルを読むと、数字、スペース、または行末の文字が得られます。いくつかのシステムでは0x0aに続いて0x0dが使用され、いくつかのシステムでは他の方法で実行され、いくつかのシステムではただ1つだけが使用されるため、行末文字は苦痛です。 GetNextValueには、それまでの内容に関する状態情報が含まれている必要があります。あなたがC++を使用しているので、コンストラクタ引数としてinput_fileを、GetNextValueをメンバ関数(このようにパラメータを渡す必要はありません)と追加のGetReadValueを持つオブジェクトにする必要があります。 – Skizz

0

あなたは数字を読むことができますチャーでキャリッジリターンに対してチェック私は以下の通りであるしようとしたスニペット:。

ifstream ifile; 
ifile.open("a.txt"); 
char ch; 
while((ch = ifile.get()) != EOF) 
{ 
    std::cout<<ch<<"\n"; 
    if (ch == '\n') 
     std::cout<<"Got New Line"; 
} 
ifile.close(); 
関連する問題