2014-09-14 3 views
1

텍스트 파일에서 숫자를 읽고 싶습니다. 파일에 다음과 같은 번호가 있습니다.파일에서 번호 읽기 C++

3 5 7 9 20 25 30 40 55 56 57 60 62 1 4 7 11 14 25 44 47 55 57 100 -5 100 1000 1005 -12 1000 1001

공간 숫자를 분리합니다. 이 코드를 읽으려면 몇 가지 코드를 만들어야했지만 문제는 줄 끝의 숫자를 읽는 것이 정확하지 않고 올바르게 읽는 방법을 모르겠다는 것입니다 (CRLF 문자 문제). 누군가 나를 도와 줄 수 있습니까? 내 코드는 다음과 같습니다.

헤더 base.h

#include <iostream> 
#include <fstream> 
#include <string.h> 
#include <cstdlib> 
using namespace std; 

class L 
{ 
    public: 
    int value; 
}; 

class t 
{ 
public: 
    L *line; 
    t(){ 
     line = new L[10000]; 
    } 
}; 

class baza 
{ 
public: 
    ifstream in; 
    ofstream out; 
    string lines; 
    char word1[1] ; 
    int wordint; 
    char tab[255]; 
    int *tab2; 

    int x; 
    int y; 
    int z; 
    int a; 
    int b; 
    int c; 
    int ile; 

    int multiplier; 
    bool negative ; 
    int negative; 
    t *table; 

    base(); 
}; 
다음

있습니다 base.cpp

#include "base.h" 

base::base() 
{ 
    wordint=0; 
    a=2000; 
    b=0; 
    tab2 =new int [a]; 
    x=0; 
    y=0; 
    z=0; 

    for(int i=0;i<a;i++) 
    { 
     tab2[i]=0; 

    } 
    multiplier=1; 
    negative =false; 
    negative1=-1; 
    lines="0"; 
    ile=0; 
    in.open("in.txt"); //open file 

    do 
    { 
     getline(in,lines); 
     if(lines!="0")  //how many lines is in the file 
     { 
      ile++; 
     } 
    } while(in.eof()!=true); 
    in.close(); 
    tablica =new t[ile]; 
    tab5 = new int[ile]; 
    in.open("in.txt"); 

    for(int i=0;i<ile;i++) 
    { 
     do 
     { 
      in.get(word1[0]); 
      if(word1[0]==45) // check if sign is negative 
      { 
       word1[0]=0; 
       negative=true; 
       in.get(word1[0]); 
      } 
      if(word1[0]!= 10) //check if not LF 
      { 
       if(word1[0]!=' ') //check if not space 
       { 
        tab[x]= word1[0]; 
        x++; 
       } 
      } 
      if(word1[0]==' ') //if space then convert from char to int 
      { 
       y=x-1; 
       do { 
        word1[0]=tab[y]; 
        wordint=atoi(word1); 
        wordint=wordint*multiplier; 
        tab2[z]=tab2[z]+wordint; 
        y--; 
        multiplier=multiplier*10; 
       } while(y>=0); 
       x=0; 
       multiplier=1; 
       if(negative==true) //check if negative 
       { 
        tab2[z]=tab2[z]*negative1; 
        negative=false; 
       } 
       z++; 
       c=z; 
       tab5[i]=c; 
      } 
      /**if(word1[0]== '10') //its not work but same as above only check if LF 
      { 
       y=x-1; 
       do{ 
        word1[0]=tab[y]; 
        wordint=atoi(word1); 
        wordint=wordint*multiplier; 
        cout<<"dupa"; 
        tab2[z]=tab2[z]+wordint; 
        y--; 
        multiplier=multiplier*10; 
       } while(y>=0); 
       x=0; 
       multiplier=1; 
       if(negative==true) //check if negative 
       { 
        tab2[z]=tab2[z]*negative1; 
        negative=false; 
       } 
       z++; 
       c=z; 
       tab5[i]=c; 
      }*/ 

     } while(word1[0]!=10); 
     for(int j=0;j<z;j++)  //write to table 
     { 
      table[i].line[j].value=tab2[j]; 
      cout<< table[i].line[j].value<<endl; 
      tab2[j]=0; 
     } 
     z=0; 
    } 
} 
+2

짧고 독립적 인 컴파일 가능한 예제를 게시 해보십시오. http://sscce.org/ –

답변

1

당신이해야 다음과 같이 간단히 예를 결합하십시오 :

먼저

코드가 게시 한 코드보다 훨씬 스마트하게 보입니다.

+0

Btw http://stackoverflow.com/questions/236129/how-to-split-a-string-in-c에서 주어진 대답은 비효율 성과 비 확장 성으로 인해 의견 섹션에서 무거운 논의를 유발하는 것으로 보입니다. – rbaleksandar

3

이것은 std::vector<int>로 파일에서 모든 숫자를 읽습니다 :

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

using namespace std; 

vector<int> read_numbers(string file_name) 
{ 
    ifstream infile; 
    infile.open(file_name); 
    vector<int> numbers; 

    if (infile.is_open()) 
    { 
     int num; 
     while(infile >> num) 
     { 
      numbers.push_back(num); 
     } 
    } 

    return numbers; 
} 
+0

파일에서 'istream :: operator >>'를 직접 호출하지 않는 이유는 무엇입니까? – DarioP

+0

@DarioP, 방금 편집했습니다. –