2013-05-02 17 views
1

파일에서 한 줄을 읽었으며 int로 변환하려고합니다. 어떤 이유로 atoi() (문자열을 정수로 변환)은 인수로 std::string을 허용하지 않습니다 (문자열 대 C 문자열과 문자 배열의 문제 일 수 있습니까?) -이 텍스트 파일을 구문 분석 할 수 있도록 atoi()을 올바르게 작동 시키려면 어떻게해야합니까? ? (그것으로부터 많은 int를 끌어낼 것입니다).문자열에서 atoi를 가져올 수 없습니다 (문자열 대 C 문자열?)

코드 :

int main() 
{ 
    string line; 
    // string filename = "data.txt"; 
    // ifstream file(filename) 
    ifstream file("data.txt"); 
    while (file.good()) 
    { 
     getline(file, line); 
     int columns = atoi(line); 
    } 
    file.close(); 
    cout << "Done" << endl; 
} 

라인 원인이 문제는 다음과 같습니다

오류 제공
int columns = atoi(line); 

:

error: cannot convert 'std::string' to 'const char*' for argument '1' to 'int atop(const char*) '

을 어떻게 제대로 atoi 함수 작업을합니까?

편집 : 감사합니다. 작동합니다! 새로운 코드 : 또한

int main() 
{ 
string line; 
//string filename = "data.txt"; 
//ifstream file (filename) 
ifstream file ("data.txt"); 
while (getline (file,line)) 
{ 
    cout << line << endl; 
    int columns = atoi(line.c_str()); 
    cout << "columns: " << columns << endl; 
    columns++; 
    columns++; 
    cout << "columns after adding: " << columns << endl; 
} 
file.close(); 
cout << "Done" << endl; 
} 

궁금 이유 = "data.txt로" 문자열 이름; ifstream 파일 (파일 이름) 실패,하지만

ifstream file("data.txt"); 

작품? 는 (나는 결국 명령 줄을 형성 파일 이름을 읽을 수 있으므로하지 문자열 리터럴 확인해야합니다)

+3

atoi를 절대로 사용하지 마십시오. 오류를보고 할 수 없습니다. std :: strtoi 또는 std :: stoi를 사용하십시오. – PlasmaHH

+2

@PlasmaHH, 맞습니다.하지만 'strtol'을 의미합니다. 'boost :: lexical_cast'도 옵션이 될 수 있습니다. IIRC 어딘가에 * 이것에 대한 질문이 * 있습니다. – chris

+0

atoi보고 오류가 도움이되지 않는 것으로 보입니다. 문제가 발생하더라도 작업을 시도합니다. 예외를 던지고 종료하는 것이 좋습니다. www.cplusplus.com에서 atoi는 "No-throw 보장 :이 함수는 결코 예외를 throw하지 않기 때문에 좋다"라는 것을 알게되었습니다. – user2333388

답변

6

c_str 소요 메소드가이 목적을 위해 존재합니다. 파일이 '좋은'이다해서

int columns = atoi(line.c_str()); 

BTW 코드가

while (getline (file,line)) 
{ 
    ... 

을 읽어야 다음의 getline은 마지막의 getline이 성공 만하는 것이, 성공을 의미하지 않습니다. while 조건에서 getline을 직접 사용하여 실제로 행을 읽었는지 여부를 알 수 있습니다.

+0

작동합니다 - 감사합니다! 그건 그렇고, 어떤 생각이 문자열 filename = "data.txt"; ifstream 파일 (filename)이 실패하지만 ifstream 파일 ("data.txt"); 공장? – user2333388

+1

같은 해결책'ifstream file (filename.c_str());'C++ 11에서도 문자열을 사용할 수 있다고 생각합니다. char *에서 string으로 자동 변환되지만 그 반대의 경우는 없습니다. 그것은 문자열 클래스가 설계된 방식입니다. – john

1

사용 line.c_str() 대신 단지 line

이 atoi 함수는 const char* 아닌 std::string

2

int columns = atoi(line.c_str());

관련 문제