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

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

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 回答