2016-08-01 5 views
0

이 프로젝트를 코딩하고 개념화하는데 문제가 있습니다. 할당되었습니다. 나는이 문제에 대한 해답을 찾아 보았지만 행운을 거의 느끼지 못했다. 아마도 정말로 분명 할 것이다.파일에서 특정 단어 읽기 및 객체에 저장하기

동물 :

이름 : [값]

소음 : [값]

내가 파일 이름에 사용자를 묻는 메시지를 표시하도록되어있어, 파일은 다음과 같은 형식을 가지고 가정입니다 다리 : 값 (그 사이의 공백없이)

그들을 파일의 수만큼 '동물 개체 "를 판독 저장할 수 있어야 3 개의 매개 변수 (이름, 잡음, 다리)를 가진 동물 객체 클래스.

내 문제는 주로 파일을 읽는 중에 발생합니다. 파일을 읽고 정보를 저장하는 좋은 방법을 찾지 못했습니다. 현재 가지고있는 코드는 다음과 같습니다. 현재 가지고있는 코드에 대한 도움과 값을 저장하기위한 아이디어. 미안하지만 설명이 잘못 되었다면, 내가했는지 명확하게 물어보십시오. 미리 감사드립니다. 당신이 정말이 파일 형식과 바인더 제본하는 경우

cout << "Enter the file name: "; 
    string fileName; 
    getline(cin, fileName); 
    cout << endl; 
    try 
    { 
     ifstream animalFile(fileName); 
     if (!animalFile.good()) // if it's no good, let the user know and let the loop continue to try again 
     { 
      cout << "There was a problem with the file " << fileName << endl << endl; 
      continue; 
     } 

     string line; 
     while (animalFile >> line) // To get you all the lines. 
     { 
      getline(animalFile, line); // Saves the line in STRING. 
      cout << line << endl; // Prints our STRING. 
     } 

    } 
    catch (...) 
    { 
     cout << "There was a problem with the file " << fileName << endl << endl; 
    } 
+0

이 경우 휠을 재발 명하는 것이 실제로 의미가 있습니까? xml, json, yaml 또는 기타 라이브러리에 기존 라이브러리 사용을 고려하십시오. – alexeykuzmin0

답변

0

는 그것을 데이터를 읽고 저장하기 위해 다음을 수행 고려해

# 1. 동물을 표현하는 클래스 Animal를 정의

struct Animal 
{ 
    std::string name; 
    int legs; 
    int noise; 
} 

# 2. istream& operator >> (istream&, Animal&)을 정의하여이 유형의 오브젝트 하나를 읽고 입력의 정확성을 점검하십시오.

std::istream& operator >> (std::istream& lhs, Animal& rhs) 
{ 
    std::string buf; 
    lhs >> buf >> buf >> rhs.name >> buf >> rhs.noise >> buf >> rhs.legs; 
} 

# 3. std::vector에 파일에서 모든 값을 읽어 std::copystd::istream_iterator를 사용

std::istream_iterator<Animal> eos; 
std::istream_iterator<Animal> bos(animalFile); 
std::vector<Animal> zoo; 
std::copy(bos, eos, std::back_inserter(zoo)); 

이 코드는 쉽게 istream& operator >> (istream&, Animal&)에 추가 할 수 있습니다 입력 오류에 대한 검사를,이 없습니다.

+0

답장을 보내 주셔서 감사합니다. 명확히하기 위해 # 2는 형식을 확인하기 위해 파일을 읽는 것입니다. # 3의 경우에도 코드의 행이 무엇을하는지에 대한 설명을 줄 수 있습니까? 완전히 파악하는 데 어려움을 겪고 있습니다. – Roberto

+0

@Roberto # 2는 실제로 데이터를 읽고 출력 인자'rhs'에 저장하여 반환합니다. 이 연산자는 다음과 같이 사용될 수 있습니다 :'Animal a; cin >> a;'. – alexeykuzmin0

+0

# 3 :'std :: vector'는 단지'Animal'의 동적 배열입니다. 'istream_iterator '는'istream'에 대한 반복자입니다. 역 참조시,'istream'에서 타입'T'의 다음 요소로 이동하면서'operator ::'에 의해 주어진'istream'에서 읽은'T' 타입의 값을 반환합니다. 인자없이 생성 된'istream_iterator'는 "end of stream iterator"입니다. 이것은 상태가 틀리며'istream_iterator'가 스트림의 끝까지 도달 할 때까지 ('operator =='에 관하여) 동일합니다. 'std :: back_inserter'는에 할당 될 때'push_back()'을 수행하는'std :: back_intert_iterator'입니다. – alexeykuzmin0