2009-03-13 4 views
2

조직의 이름 (공백없이)과 부동 정수가 들어있는 텍스트 파일에서 정보를 수집하려고합니다. 이 정보를 배열 구조에 저장하려고합니다.filestream에서 개행 문자를 검색합니다.

나는 지금까지 정보를 수집하는 데 문제가 있습니다. 여기 TEXTFILE 샘플이다

CBA 12.3 4.5 7.5 2.9 4.1

는 TLS 3.9 1 8.6 12.8 4.9

I 각 조직 128 상이한 수 있고, 최대 가능 텍스트 파일의 200 개 조직

이 내 구조는 지금까지 모습입니다 :

struct callCentre 
{ 
char name[256]; 
float data[20]; 
}; 

내 주요 :

int main() 
{ 
callCentre aCentre[10]; 
getdata(aCentre); 
calcdata(aCentre); 
printdata(aCentre); 
return 0; 
} 

그리고 GetData의 기능 :

내가 달성하기 위해 노력하고있어
void getdata(callCentre aCentre[]) 
{ 
ifstream ins; 
char dataset[20]; 

cout << "Enter the name of the data file: "; 
cin >> dataset; 

ins.open(dataset); 

if(ins.good()) 
{ 
    while(ins.good()) 
    { 
     ins >> aCentre[c].name; 
     for(int i = 0; i < MAX; i++) 
     { 
      ins >> aCentre[c].data[i]; 
      if(ins == '\n') 
       break; 
     } 
     c++; 
    } 
} 
else 
{ 
    cout << "Data files couldnt be found." << endl; 
} 
ins.close(); 
} 

내 getdata 함수는 다음과 같습니다. 먼저 구조에 조직 이름을 저장 한 다음 각 float을 데이터 arra로 읽습니다. 프로그램이 줄 바꾸기 바이트를 감지 할 때까지. 그러나, 지금까지 새 라인 바이트에 대한 내 검사가 작동하지 않습니다.

변수 cMAX이 이미 정의되어 있다고 가정합니다.

어떻게해야 제대로 할 수 있습니까?

답변

2
char byte = ins.peek(); 

또는

if(ins.peek() == '\n') break; 

(편집) : 당신은 어떤 파일이 끝나는 줄 바꿈이 없을 수 있기 때문에) 당신의 엿보기 (후 EOF를 확인 할 수 있습니다.

정적 배열 대신 vector<callCentre>을 사용하는 것이 좋습니다. 입력 파일의 길이가 배열의 용량을 초과하면 스택 전체를 걸을 것입니다.

+0

이것은 정확히 내가 원했던 것입니다. 고맙습니다. – Bobby

3

>> 연산자는 공백을 구분 기호로 취급하며 줄 바꿈 문자를 포함하므로 그 문자를 먹기 때문에 사람을 볼 수 없습니다.

+0

사실 아니, 그것은 모든 것을 먹을 것이다 해커의 다음 비트는 기본 개념을 설명 공백 문자가 나타날 때까지 다음 번에 그 문자를 호출하면 다른 공백 문자에 도달 할 때까지 공백 문자를 건너 뜁니다. "안녕하세요" 안녕하세요. 먹고, 아직도 거기에 있습니다. –

+0

계속. .peek()를 사용하면 다음 문자가 라인에 있는지 확인할 수 있습니다. –

+0

@ X-Istence와 함께 "먹어라"나는 건너 뛰었고 당신은 그들을 보지 못했다. >> "hello \ n there"에 >>의 두 가지 용도로 "hello"와 "there"가 표시됩니다. – Rubendv

3

줄을 읽은 다음 줄을 자르는 것이 필요합니다. 나는 값을 개별적으로 각 행을 다른 후 파일 한 줄을 읽고 구문 분석

#include <iostream> 
#include <string> 
#include <sstream> 
using namespace std; 

int main() { 
    string line; 
    while(getline(cin, line)) { 
     istringstream is(line); 
     string cs; 
     is >> cs; 
     double vals[10]; 
     int i = 0; 
     while(is >> vals[i]) { 
      i++; 
     } 

     cout << "CS: " << cs; 
     for (int j = 0; j < i; j++) { 
      cout << " " << vals[j]; 
     } 
     cout << endl; 
    } 
} 
+0

이것을 구현하려고했습니다. 그래도 좋은 생각. – Bobby

2

:

std::string line; 
while (std::getline(ins, line)) { 
    std::istringstream sline(line); 
    sline >> aCentre[c].name; 
    int i = 0; 
    while (sline >> aCentre[c].data[i]) 
    i++; 
    c++; 
} 
관련 문제