2014-04-30 2 views
0

.txt 파일에서 정보를 읽고 이전에 만든 struct 유형에 정보를 저장하려고합니다. 여기 텍스트 파일에서 생성 된 struct 유형을 읽는 데 문제가 있습니다.

는 구조체의 정의입니다 :

struct String 
{ 
    const char* text; 
    int sz; //length of string not including null terminator 
}; 

여기에 그냥 엄청난 오류가 발생하고 마지막에 입력하는 '제목을'변환 할 수 없습니다 "라는 ('서명 문자 나에게 오류를주는 코드입니다 * '

CDs* createCDs(const char* file_name) 
{ 
    ifstream input_file; 
    input_file.open(file_name); 

    String* artist; 
    input_file >> artist; 

    String* title; 
    input_file >> title; 

또한 정보, 그냥 텍스트입니다. 어떤 도움이나 입력을 감상 할 수 있습니다에서 읽을 감사합니다.

+0

왜 이렇게 많은 불필요한 포인터가 ... – yizzlez

+0

@awesomeyi 이것은 C++ 클래스에 대한 나의 소개를위한 것이며, 목적은 불편한 양의 포인터를 사용하여 편안하게 해주는 것입니다. haha ​​ – user3558697

+0

'const char * text;' 그러한'String' 구조체에는별로 유용하지 않습니다. -/... –

답변

3

두 변수 artist 및,은 포인터이며 개체가 아닙니다. 다음과 같은했다면 따라서, 같은 동작을 표시되지 않는 :

String artist; 
input_file >> artist; 

당신이 operator>>()의 적절한 과부하가 있었다 물론 가정을 (나는 약간의 것을 설명 할 것이다).

포인터를 읽으려고하면 컴파일러에서 오른쪽 인수에 String에 대한 포인터를 취한 스트림 추출 연산자 (operator>>())의 오버로드를 찾을 수 없기 때문에 오류가 발생합니다. 컴파일러가 artist 또는 title을 오른쪽 인수로 변환하려고 할 때 발생하는 모든 후보 오버로드 및 해당 오류를 나열했기 때문에 하단에 "cannot convert 'title' to type 'signed char*'이 표시되는 이유가있었습니다.


포인터를 사용해야하는 경우 유효한 개체로 초기화해야합니다. 스트림이 그것으로 데이터를 읽을 수 있도록 그리고 당신은 포인터 역 참조가 가리키는 객체에 대한 참조를 얻을 수 있어야합니다 다음

String* artist = new String; 
input_file >> *artist; 

그러나 다시, 당신은 실제로 포인터 여기 필요합니까. 이것은 스택에 객체를 유지하여 수행 할 수 있습니다 :

String artist; 
input_file >> artist; 

new로 생성 된 데이터에 할당 된 경우 여전히 포인터를 사용할 필요가 어떤 이유로, 당신은 메모리를 포인터 포인트 (할당을 해제 기억해야하는 경우). 당신은이 delete을 사용하여 수행

// when you are finished using the data artist or title points to 
delete artist; 
delete title; 

또는 당신이 std::unique_ptr<String>를 사용할 수 있습니다. std::unique_ptr<>는 범위를 벗어나면 당신을위한 메모리를 관리하는 컨테이너입니다, 그래서 당신은 자원 자신의 할당을 해제하는 것이 필요하다 : 컴파일러는 새로운 인 std::unique_ptr<>를 지원하지 않는 경우

{ 
    std::unique_ptr<String> title; 
    // ... 
} // <= the resource held by title is released 

을 (C++ 11) 객체의 경우 std::shared_ptr<>을 사용할 수 있습니다.


사용자 정의 클래스에 스트림 I/O 의미를 포함 할 때, 당신이 이후에 클래스의 데이터 멤버로 데이터를 추출 스트림 연산자의 오버로드를 제공하는 것이 일반적입니다.

당신이 우리를 표시 한 것으로 판단
X x; 
istream_object >> x; 
ostream_object << x; 

, 당신이 입력 스트림 개체에 대한 과부하를 제공했다고 생각하지 않습니다 그것은 구문을 할 수 있습니다. 여기에 하나가 당신의 String 클래스 같을 것이다 무엇 :

std::istream& operator>>(std::istream& is, String& s) 
{ 
    // code for extraction goes here 
} 

당신이 추출기에 대한 액세스를 필요로 개인 회원이있는 경우, 당신은 클래스의 친구로 그것을 선언 할 수 있습니다.

관련 문제