2013-01-03 2 views
5

이것은 파일 스트림 읽기 및 쓰기 작업이 포인터를 따라 쉽게 이동할 수 있기를 바라는 종류의 간단한 질문입니다. carray []를 어느 방법이 사용과 관계없이 동일한 내용을 포함 않는다 말하면fstream 읽기/쓰기 이동 파일 포인터를 수행하지 않습니다

dataFile.seekg(cpos,ios::beg);  
cpos=10000; 
for (i=0;i<20;i++) { 
    dataFile.read(carray[i],1); 
} 

(I는 볼 수는 동일 (논리적)에

cpos=10000; 
for (i=0;i<20;i++) { 
    dataFile.seekg(cpos+i,ios::beg); 
    dataFile.read(carray[i],1); 
} 

은 : 일례로서 첫 번째 방법은 효율적이므로 올바른 대답이 '예'라고 기대하고 있습니다.) 그렇다면 쓰기 작업에서 나타나는 동일한 문제가 있습니까?

답변

5

예, 작동하는 방식입니다. 그래도 당신의 예는 꽤 똑같지는 않습니다. 첫 번째 예제는 10000, 그 다음은 10001, 그 다음 10002 등을 읽습니다. 두 번째는 초기 위치를 설정하기 위해 루프 외부에서 검색해야합니다. 읽기에 의해

cpos=10000; 
dataFile.seekg(cpos,ios::beg); 
for (i=0;i<20;i++) { 
    dataFile.read(carray[i],1); 
} 
+0

죄송합니다. 나는 루프에서 탐색하지 않는 것을 보여 주려했습니다. 확인 감사합니다. – mlewis54

1

예, 파일 포인터가 자동으로 이동 및 쓰기 작업 : 100 %에 해당 되려면, 당신은 당신의 두 번째 예제의 모습이 필요합니다. ... 찾는 중 의 성능이 이 많고이 좋습니다. 또한 file.read(ptr, 20)을 사용하면 file.read(ptr + i, 1)의 20 배를 사용하는 것보다 훨씬 빠릅니다. 동일한 의미를 얻기 위해서는 하나의 탐색을 사용하여 적절한 위치로 이동해야합니다.

파일 스트림을 검색하면 스트림을 문자 읽기 또는 쓰기를 계속할 수있는 상태로 설정합니다. 읽기/쓰기 모드 (std::ios_base::in | std::ios_base::out)로 열린 스트림에 대한 읽기와 쓰기간에 전환하려면 다음을 입력해야합니다. 목표물 탐색. 따라서 각 스트림은 재미있는 방법으로 사용 가능한 버퍼를 설정합니다. 스트림은 문자 시퀀스를 읽거나 쓰는 것만으로는 할 필요가 없습니다. 또한 각 탐색을 작성할 때 코드 변환을 위해 초기 상태가되기 위해 문자를 쓸 필요가 있는지 여부를 최소한 확인합니다.