0

次のような形式のファイルがあります。

2
3 4
7 8 9
10 20 22 02
...

基本的に、スペースで区切られた各行の数字。後でツリーを作成する必要があるため、ファイルから読み取り、すべての番号を抽出し、行番号も維持する必要があります。入力を取得するためにこれを行っていますが、奇妙な出力が得られます。

#include<cstdio>
#include<iostream>
#include<cctype>
using namespace std;

void input()
{
    char c,p;
    while(c=getchar()!=EOF)
    {
        if(c=='\n') printf("},\n{");
        else if(c==' ') printf(",");
        else if(c=='0')
        {
            p=getchar();
            if(p==' ')
            {
                printf("%c%c,",c,p);
            }
            else
            {
                printf("%c,",p);
            }
        }
        else if(isalpha(c))
        {
            printf("%c",c);
        }
    }
}


int main()
{
    input();
}

画像は入力と出力を示しています ここに画像の説明を入力

4

2 に答える 2

2

あなたはC++よりも多くのCを書いています。

C++ では、ストリームを使用できます。peek() を使用して次の文字を確認し、>> を使用して実際に読み取ります。

例えば:

using namespace std;
int main(){
  ifstream s("/tmp/input");
  int nr;
  while (!s.eof()) {
    switch (s.peek()){
      case '\n': s.ignore(1); cout << "},\n{"; break;
      case '\r': s.ignore(1); break;
      case ' ': s.ignore(1);  cout << ", "; break;
      default: if (s >> nr) cout << nr; 
    }
  }
}
于 2013-05-27T10:37:44.560 に答える
2

ファイル ストリームを使用し、1 行ずつ読み取り、各行を stringstream で解析します。

std::ifstream file("filename");
std::string line;
size_t line_number(1);
while ( std::getline(file, line) ) // reads whole lines until no more lines available
{
    std::stringstream stream(line);
    int tmp;
    std::cout << "Numbers in line " << line_number << ":";
    while ( stream >> tmp ) // reads integer divided by any whitespace until no more integers available
    {
        std::cout << " " << tmp;
    }
    std::cout << "\n";
    ++line_number;
}

含める必要があります

#include <iostream> // for std::cout
#include <string>   // for std::string
#include <fstream>  // for std::ifstream
#include <sstream>  // for std::stringstream
于 2013-05-27T10:38:03.347 に答える