2017-03-11 1 views
1

본질적으로 나는 8 열을 가진 데이터 파일을 가지고 있고 각 열의 각 값을 배열 변수에 넣고 싶다. 그러나 문제는 일부 값이 누락되었다는 것입니다. 예 :누락 된 열이있는 파일에서 데이터를 읽습니다. C++

100 54201.10 49392 9379101 10381.1372 
101 5823829  73929 83729.77 

누락 된 값은 여분의 탭 또는/t 공백으로 구분됩니다. 누락 된 데이터를 무시하고 사용 가능한 올바른 변수에 올바른 값을 입력하면 값을 읽을 수 있습니까?

infile >> network; 
    string val = isNaN(network); 
    if (count % 8 == 0) { ID[count/8] = val; } 
    if (count % 8 == 1) { time[count/8] = val; } 
    if (count % 8 == 2) { country_code[count/8] = val; } 
    if (count % 8 == 3) { sms_in[count/8] = val; } 
    if (count % 8 == 4) { sms_out[count/8] = val; } 
    if (count % 8 == 5) { call_in[count/8] = val; } 
    if (count % 8 == 6) { call_out[count/8] = val; } 
    if (count % 8 == 7) { internet[count/8] = val; } 
    count++; 
+0

'스위치'라는 말을 들었습니까? –

+0

탭 및 공백에 모호하지 않은 파일 형식도 지정하십시오. –

+0

내 대답은 전혀 도움이 되었습니까? –

답변

0

좋은 방법을 C++에서이 작업을 수행하기 위해 각 라인을 얻을 수의 getline을 사용 :

내가 사용했습니다.

그런 다음 substr을 사용하여 레코드 컬렉션을 채 웁니다. 필드가 탭으로 구분되고 왼쪽에 숫자가 정당하다고 가정하면 다음과 같이 기본값을 처리 할 수 ​​있습니다.

posTab = s.find_first_of('\t'); 
records[i].id = posTab == 0 
    ? defaultID 
    : std::atoi(s.substr(0, posTab).c_str()); 

내가 부동 소수점 및 배정 밀도 부동 소수점 번호는 0부터 시작 레코드 인덱스 인덱스, 당신은 표준 : : atoi 함수에 해당하는 표준 수치 파서를 교체해야합니다.

데이터가 탭으로 구분 된 경우 각 레코드의 각 필드에 대해 find_first_of (posTab + 1, '/ t')를 사용하여 저장할 수있는 이전 위치부터 시작하여 각 필드의 시작을 찾습니다. 평등 테스트로 사용할 posPreviousTab과 0 대신 첫 번째 substr 매개 변수 대용량 데이터 세트의 경우 일부 조건에서

노트

는, 표준 : : 목록을 표준 : : 벡터보다 빠릅니다. 케이스에 대한 두 옵션을 비교하는 테스트를 작성할 수 있습니다.

큰 데이터를 다루는 경우 메모리에 모든 레코드를 저장하는 대신 C에서 char [MAXSIZE] 및 이와 동등한 알고리즘을 사용하고 즉석에서 처리해야합니다.

관련 문제