istream :: get (char*, streamsize n, char delim)로 이상한 결과를 얻고 있습니까?

StackOverflow https://stackoverflow.com/questions/1943481

  •  20-09-2019
  •  | 
  •  

문제

나는 다음과 유사한 형식의 파일로 읽고 있습니다.

TIME, x, y, z
00:00:00.000 , 1, 2 , 3
00:00:00.001 , 2 , 3 , 4

기타 및 다음과 유사한 코드 :

std::ifstream& istream;
char buffer[15];
double seconds, hours, mins; // initialised properly in real code

// to read in first column
istream.get(buffer, 14, ',');

int scanned = std::sscanf(buffer, "%d:%d:%lf", &hours, &mins, &seconds);

대부분의 시간 동안 첫 번째 열에서 잘 읽습니다. 그러나 때때로 SSCANF가 실패하고 코드 기어 디버거를 사용하여 버퍼의 내용을 확인하면 읽은 것을 알 수 있습니다. \000:00:023 예를 들어. 어떤 이유로 든 널 캐릭터를 수집하고 있습니다.\0, 전면에. 텍스트 파일을 보면 올바르게 읽은 다른 모든 시간 값과 동일한 형식 인 것 같습니다. 왜 때때로 널 캐릭터를 추가 하는가? 그리고 주변의 작업이 있습니까?

도움이 되었습니까?

해결책

빈 줄을 읽거나 파일 끝을 지나서 읽으려고합니다.

첫 번째 캐릭터는입니다 \0, 문자열의 끝을 의미합니다.

그 후 모든 캐릭터는 손대지 않은 기억입니다.

다른 팁

이것을 시도하고보세요 ..

ifstream inpfile("sample.txt");
char buffer[15];
inpfile.ignore(80, '\n');
while (!inpfile.eof())
{

    inpfile.get(buffer, 14, ',');
    int hrs, mins;
    double secs;
    hrs = mins = secs = -1;
    sscanf_s(buffer, "%d:%d:%lf", &hrs, &mins, &secs);
    cout << "hrs:" << hrs << "\t"
        << "mins:" << mins << "\t"
        << "secs:" << secs 
        << endl;
    inpfile.ignore(80, '\n');
}

아마도 입력 파일에 어딘가에 후행 쉼표가있을 가능성이 높습니다. 또는 한 줄의 마지막 숫자 후 14 자 이상의 공백 문자 일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top