istream :: get (char*, streamsize n, char delim)로 이상한 결과를 얻고 있습니까?
-
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 자 이상의 공백 문자 일 것입니다.
제휴하지 않습니다 StackOverflow