2012-04-23 2 views
0

다음 C 코드를 C++로 번역하고 싶습니다.fscanf C++ equivalent

FILE *fp = NULL; 
fp = fopen("./filename", "r"); 
int i = 0; 
fscanf(fp, "%d\n", &i); 
uint16_t j = (uint16_t) i; 

이 내가이 해낸 것입니다 :

ifstream file; 
    string filename = "./filename"; 

    file.open(filename.c_str(), ios::in); 
    errno = 0; 
    if (file.fail()) { 
     int tmp = errno; 
     std::cout << file.c_str() << " not found: strerror(" << tmp << "): " << strerror(tmp)); 
    } 
    int i = 0; 
    file >> i >> std::endl;  
    uint16_t j = (uint16_t) i; 

내가 구문이 올바른지 개선 가능한 더 중요하게는 입력의 모든 종류에 대한 안전 여부를인지 알고 싶습니다.

+0

먼저 시도해 보겠습니다. 오류가있을 경우 지역 사회에 "이것이 맞다"라기보다는 구체적으로 질문하십시오. 두 프로그램에 대해 서로 다른 입력을 시도해보고 어느 프로그램에서 어떤 프로그램이 실패했는지 그리고 왜 다른 프로그램인지 확인하십시오. –

+2

아니면 C 코드를 그대로 둘 수 있습니다. C++은 C의 상위 집합입니다. –

+0

@RogerLipscombe : C++ 버전에 따라 다릅니다. C++ 03에는 C99'uint16_t'가 없었으며 모든 사람이 C++ 11로 전환하지 않았습니다. –

답변

2
int read_int(const std::string file_name) { 
    std::ifstream file(file_name); //the file will close itself on destruction 
    std::uint16_t i; 
    //extract type, don't worry about what it is it will either compile or not 
    if(!(file >> i)) { //Catch failure 
     //or however you wish to deal with it. 
     throw std::runtime_error("can't read file"); 
    } 
    return i; 
} 

int main() { 
    try{ 
     std::uint16_t i=read_int("./filepath"); 
     //do with i... 
    } 
    catch(const std::exception& e) { 
     std::cerr << e.what() << std::endl; 
     return EXIT_FAILURE; 
    } 
    return EXIT_SUCCESS; 
} 

참고 그런 다음 파일을 열 c_str()를 사용해야합니다 C++ (11)을 가지고 있지 않지만, 문자열 방법을 선호하는 경우.

편집 :

http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization

: 스스로를 종료 할 필요가 없습니다, 자신을 닫습니다 fstream이 기능은 RAII의 의미에 의존하는 것이 훨씬 낫다 그러나 당신이 그렇게해야합니까 넣다가 RAII는 생성시 파일을 열어야한다고 지시하고 파기 될 때까지 닫습니다. 이렇게하면 유효하지 않은 (EOF, 파일을 찾을 수 없음 ...) fstream 객체가 버그를 방지하지 않습니다. RAII는 C++의 근본적인 구조이며 리소스가 관련된 곳에서 사용해야합니다. ,

http://en.cppreference.com/w/cpp/io/basic_fstream

가 basic_fstream과 연관된 버퍼 자폭

+0

@Blastfurnace 예 do – 111111

+0

@chris, 다시 한 번 감사드립니다. 나는 비가 올 때부터이 물건을 얻기에는 너무 일찍 왔습니다. : S – 111111

+0

이렇게 열면 파일이 파기 될 때 문서가 닫히는다고 말하는 문서로 보내주십시오. 나는 그것을 발견 할 수 없다 ... – bob

2

정확한 동등한 것 파일 폐쇄 :

fstream 소멸자 용 문서는 여기

std::ifstream fs("./filename"); 
int i = 0; 
fs >> i >> std::ws; 
uint16_t j = i; 

thi 당신이 정말로 원하는 것은 또 다른 질문입니다. fscanf에 대한 형식 문자열에서 을 사용하면 이 실제로 '\n'이고 임의의 공백이 아닌 것을 읽는 것을 제안합니다. fscanf에있는 "\n"의 의미는 다음 비 공백으로 건너 뜁니다. 가 아닌 공백 문자 또는 파일의 끝을 만난 때까지 — 위 scanf — 또는 내 교체에서 반환하지 않습니다 때문에 (대화식 입력의 경우, 이것은 진짜 문제가 될 수 있습니다. 들어 파일로부터의 입력은, 그것이 문제가되지 않을 수도있다.)

라인 배향 입력을 판독 할 때, 고전 용액을 파싱 한 후 std::getlinestd::istringstream를 사용하는 것이다.