2010-04-10 3 views
2

C++의 파일에서 double을 어떻게 읽습니까?C++의 파일에서 double을 읽는 방법

int의 경우 getline()을 사용하고 atoi를 사용할 수 있지만 함수를 두 배로 배열하지는 않습니다. double에서 읽거나 char 배열을 double로 변환하는 데 사용할 수있는 것은 무엇입니까?

+1

왜 char *로 읽지 않고 sscanf를 사용합니까? – Cam

+1

@incrediman : 이미 표준 스트림을 사용하고 있다면 아마도 C 함수 두통을 다루고 싶지 않을 것입니다. –

+0

'getline()'과'atoi()'를 고집하고 싶다면'atoi()'를'atof()'로 대체하면 괜찮을 것입니다. 그러나 @R Samuel Klatchko의 방법은 double과 int 모두 잘 작동합니다. –

답변

3

당신은 스트림 추출을 사용할 수 있습니다

std::ifstream ifs(...); 
double d; 
ifs >> d; 

이 작품은 다른 후 공백, 스트림 내의 다음의 데이터가 텍스트 표현의 double해야한다는 제공. 오류가 있다면

추출 후

, 당신은 볼 스트림의 상태를 확인할 수 있습니다

ifs >> d; 
if (!ifs) 
{ 
    // the double extraction failed 
} 
+2

이것은 잘못되었습니다. '.gst()'와 약간 다른,'.rdstate() == 0'과 동등한) 실패 ('.fail()'에 대한 스트림을 테스트하십시오. 'if (! (ifs >> d)) {/ * failed * /}'또는'ifs >> d;를 사용하십시오. if (ifs) {/ * use d * /} else {/ * failed * /}'(일반적으로 더 유용)'if (ifs) {/ *. –

+3

('! stream'을 사용하는 것은'stream.fail()'과 동일합니다.'bool (stream)'을 사용하는 것은'! stream.fail()'과 같습니다.) –

+0

@RogerPate - 감사합니다. –

3

그들처럼 .. 기능으로 atof(), 또는 아토의 사용을 고려하지 마십시오 오류 진단을 허용하지 않습니다. strtodstrtol을 살펴보십시오. 또는 스트림 추출 연산자를 사용하십시오.

+1

downvote 이유는 무엇입니까? –

+0

+1 왜냐하면 나는 strtod와 strtol을 모르고 있었기 때문에 문구 "downvote에 대한 이유?"의 사용을 위해 – JonM

+0

-1을 사용했다. – sblom

0

당신은 예를 들어 istringstream을 활용할 수 있습니다, 여기 toDouble 및 toInt입니다 : 내가 궁금하네요

double toDouble(string s) { 
    double r = 0; 
    istringstream ss(s); 
    ss >> r; 
    return r; 
} 

int toInt(string s) { 
    int r=0; 
    istringstream ss(s); 
    ss >> r; 
    return r; 
} 
+0

이것은 오류 검사를 포함하여 더 나은 형식의 boost 형태로 lexical_cast로 이미 존재합니다. –

+0

@Roger Pate : 네, 맞습니다. 이것은 부스트를 사용할 수없는 경우에 유용합니다. –

+0

@ 빌리 : 그것은 닐이 올바르게 [지적하는] atof보다 유용하지 않습니다. (http://stackoverflow.com/questions/2615078/how-to-read-in-a-double-from-a-file- in-c/2615119 # 2615119)는 피해야합니다 (입력 내용의 유효성을 아직 확인하지 않은 경우). 그러나 여기에는 해당 사항이 없습니다. –

2

것은, (예를 들어, 로케일이 분리 대신 점의 쉼표를 사용할 수 있습니다 로케일 설정에주의하는 한 필요하지 않습니다 소수 부분) 또는 stringstreams는 항상 표준 "C 로켈"표기법을 기본값으로 사용합니까?

관련 문제