2017-09-19 7 views
1

내 파일을 거치기위한 반복기를 만들려고합니다. 내 파일은 바이너리이며 내부에 int 값을 가지고 있으므로 내 관점에서는 그렇게 작동해야합니다. 하지만 오류가 나타납니다 "데이터 멤버의 잘못된 사용"IntFile :: file ' "그래서 내가 코드를 어디에 오류가 나타납니다. 어떻게 관리 할 수 ​​있습니까? 내가 오류를 받고 있어요cstdio와 함께 작동하는 사용자 정의 iterator 구조체 만들기

#include <iostream> 
#include <cstdio> 


using namespace std; 


class IntFile 
{ 
public: 
    int index; 
    FILE* file;   // Error here 
    IntFile() {} 
    ~IntFile() {} 
    int mnumbers[10]; 
    int mnumbers2[10]; 
    int value; 

    // And this whole class does not work 
    class iterator 
    { 
     bool operator ++() 
     { 
      file = fopen ("text.txt", "r+b"); 
      fseek (file, 4*index, SEEK_CUR); 
      fclose(file); 
     } 
     bool operator --() 
     { 
      file = fopen ("text.txt", "r+b"); 
      fseek (file, (-4)*index, SEEK_CUR); 
      fclose(file); 
     } 
     /* 
     iterator begin() 
     { 
      return ; 
     } 
     iterator end() 
     { 
      return ; 
     } 
     */ 
    }; 

}; 
+0

관련이 있습니다 : https://stackoverflow.com/questions/46243549/going-through-file-using-iterators – NathanOliver

+0

@NathanOliver 정확하지 않습니다. –

+1

'iterator'에는'file'이라는 데이터 멤버가 없습니다. 'IntFile' 안에 중첩되어 있다는 사실은'IntFile' 객체에 대한 연결을 제공하지 않습니다. 또한,'fseek'는 ** 현재 **'FILE *'객체에 적용되며 기본 파일에는 적용되지 않습니다. 파일 열기, 찾기 및 닫기는 효과가 없습니다. –

답변

1

IntFile::iterator "데이터 멤버 'IntFile :: 파일을'의 잘못된 사용은"데이터 멤버 file이없는 말했다 않으며 암시 적으로 가지고있다 IntFile의 인스턴스에 대한 참조 (예 : Java의 경우)

IntFile::iterator

가 데이터 멤버 사용할 수 있도록 IntFile에 대한 참조를 필요 :

그러나

class iterator 
{ 
    explicit iterator(IntFile &file) : file(file) {} 

    // Your other code 

private: 
    IntFile &file; 
}; 

는 그런 다음, file.filefile.index에 액세스 할 수 있습니다, 등,이 경우 분해한다 이 방법을 사용하면 모두 하나의 파일 핸들을 공유하므로 파일 내의 단일 위치를 공유하므로 여러 반복자를 만들고 파일의 다른 위치를 가리 키도록 기대할 수 있습니다. 각 반복자가 자신의 위치를 ​​추적하고 각 작업 (스레드로부터 안전하지 않음) 전에 탐색하거나 각 반복자에 대한 파일 핸들을 복제 할 수 있습니다 (반복자 당 추가 파일 설명자 사용).

또는 파일을 메모리 맵핑하고 포인터를 맵핑 된 주소 공간에 반복자로 사용하는 것이 훨씬 쉽습니다.

+0

@cdhowe, 죄송합니다. 이전에 회신 할 시간이 없었습니다. 나는 당신이 말한 방법대로 만들었지 만 지금은이 "file = fopen ("text.txt ","r + b ");을 사용하지 않습니다." 다른 피연산자 유형 때문입니다. 내가 어떻게 바꿀 수 있는지 생각해? –

+0

@IvanovIvan 새 코드를 표시하십시오. – cdhowie