2011-12-17 9 views
1

가 나는 바이너리 있다고 내 파일을 나열하고 내 구조체에서에 fwrite FUNC와 쓰기 기능 썼다 : 그것은 한 번 내 모든 파일에 대한 인쇄fseek가 작동하지 않는 이유는 무엇입니까?

void ReadFile::printList(){ 
clearerr(bookFilePtr); 
fseek(bookFilePtr,0L,SEEK_SET); // set to begin of file 
int counter = 1; 
cout << "***************************************************" << endl; 
struct book tmp ; 
while (!feof(bookFilePtr)){ 
      fread(bookPtrObj,sizeof(struct book),1,bookFilePtr); 
    cout << bookPtrObj->name << "s1"<< endl; 
    cout << bookPtrObj->publisher << "s2"<< endl; 
    cout << bookPtrObj->author << "s3" <<endl; 
    cout << bookPtrObj->stock << endl; 
    cout << bookPtrObj->translation << endl; 
    cout << bookPtrObj->trasnlator << "s4" <<endl; 
    cout << bookPtrObj->delayDays << endl; 
    cout << bookPtrObj->delayPay << endl; 
    cout << "***************************************************" << endl; 
    fseek(bookFilePtr,counter * sizeof(struct book) ,SEEK_SET); // seek to next data 
    counter ++; 
} 

을,하지만 내 루프에서 종료하지 않았다. 내 func는 file.How에서 마지막 데이터를 인쇄하여 내 func을 종료하고 파일 끝까지 확인합니까? fseek는 작동합니까?

+0

왜 귀찮게 찾으십니까? 당신은 이미'sizeof (struct book)'바이트만큼 파일 포인터를 옮겼습니다. 어쨌든 각 호출마다'fread '결과를 확인해야하지만, 그건 별개의 문제입니다. –

답변

3

while(!feof(bookFilePtr))은 읽기 루프를 수행하는 나쁜 방법입니다. !feof(...)은 fread가 성공할 것이라고 보장하지 않습니다. 을 반복해야하고 fread을 대신 성공해야합니다. fseek

while(fread(bookPtrObj, sizeof(struct book), 1, bookFilePtr) == 1) { 
    // blah blah do the things 
} 

호출 너무 중복 : 당신이 찾는 필요가 없습니다 fread 이미 파일 커서 자체를 진행시킨다.

1

while (!feof(f))이 의미하는 바를 의미하지는 않습니다. '현재 위치가 파일 끝에 있습니다'라는 의미는 '파일의 마지막 끝을 읽으려고 마지막으로 읽음'을 의미합니다. fread 등으로 설정되고 fseek 등으로 지워진 플래그입니다. fread에는 반환 값이 있습니다. 이 반환 값은 읽기 성공 여부를 나타냅니다. 루프 상태로 사용하십시오.

fseek의 반환 값도 무시합니다. 동일한 이유로 좋지 않지만, 적어도 직접적으로는 문제의 원인이 아닙니다.

실제로이 코드는 fseek으로 실험 할 수있는 코드 일 뿐이지 만 루프의 fseek은 위치가 이미 있어야하는 위치를 설정하므로 값을 추가하지 않습니다.

관련 문제