如何用c ++中的空格解析文件?

时间:2013-05-27 10:16:08

标签: c++ parsing

我有一个格式为:

的文件
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();
}

图像显示输入和输出 enter image description here

2 个答案:

答案 0 :(得分:2)

你写的是比C ++更多的C语言。

在C ++中,您可以使用流。使用peek()检查下一个字符,&gt;&gt;实际阅读它。

E.g:

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; 
    }
  }
}

答案 1 :(得分:2)

使用文件流,逐行读取并使用字符串流解析每一行:

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