2013-05-27 2 views
0

У меня есть файл формата как:Как разобрать файл с пробелами в C++?

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

+0

И «странные выходы» вы получаете ...? –

+0

Можете ли вы показать, каков ожидаемый результат и какой результат вы действительно получаете? – A4L

+0

Мне кажется странным, что вы используете 'getchar()' для чтения из файла !! Или вы используете 'printf' для записи в файл? –

ответ

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

Используйте файл потока, читать построчно и разобрать каждую строку с 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 
Смежные вопросы