[c++]파일읽기를 할때에 파일의 일부분만을 메모리로 읽어오는
글쓴이: gyxor / 작성시간: 화, 2004/05/11 - 12:02오후
#include<iostream> #include<fstream> using namespace std; int main(){ fstream file("data.txt",ios::in); //-data.txt- //abcdefh... char data[100] = {0}; file.read(data,2); cout << file.tellg(); return 0; }
위 소스에서는 전체 파일을 메모리(파일스트림)로 가져온뒤에
그중에 2개의 char를 읽었습니다.
따라서 파일포인터는 2가 되었습니다.
그런데
fstream file("data.txt",ios::in);위 함수에서 처럼 파일을
통째로 메모리로 가져오지 않고..
예를 들어(이런 함수는 없지만...)
fstream file("data.txt", ios::in ,100 ,200); 처럼
파일의 일부분만을 선택해서 가져오는 방법은 없나요?
답변부탁드립니다.
ps : C,C++책의 파일처리 부분을 다 찾아 봤는데요..
일단 파일전체를 메모리상으로 가져온뒤 그 내용중에서
선택하는 seek()등..의 함수뿐이었습니다.
Forums:
Re: [c++]파일읽기를 할때에 파일의 일부분만을 메모리로 읽어오
C++ 의 fstream이나, C 의 fopen 모두 파일을 통째로 메모리에
올리지 않습니다. 파일의 일부를 경유 버퍼 ( intermediate buffer )에
올려두어서, 작은 크기의 데이터를 반복적으로 입출력하는 경우에
대해 속도를 향상시킵니다. 경유버퍼는 플렛폼에 따라 대개
수백~수천 바이트 정도 밖에 되지 않습니다.
파일 관련 표준 함수 중에 파일을 통째로 메모리에 올려서 입출력하는 것은
없습니다. 그 메모리와 파일의 일부만 입출력하면되는 경우 속도상의
비효율을 어찌 감당하라구요.
찾아보신 seek 관련 함수로 필요한 것을 구현하실 수 있을 것 같네요.
Orion Project : http://orionids.org
좋은 답변 감사합니다.
제가 시스템 버퍼에 관해서 잘 못 알고 있었습니다.
ifstream file("data.txt",ios::in);
file.seekg(64000);
file.read(...)
하게 되면 하드디스크의 64000위치에 해당하는 섹터를 찾아서
시스템 버퍼로 가져온뒤에 다시 메모리로 읽어오는..
디스크제어기-> I/O processor -> 메모리(시스템 버퍼) -> 메모리
과정을 잘못이해했었습니다.
첫째,
그런데 시스템 버퍼의 사이즈는 듣기로..
부팅시에 설정내용이 들어있는
하드디스크의 sector 0번지의 설정내용에서 클러스터사이즈부분
ex> 2*18*80 ;Number of sectors
에 의해서 셋팅이 되는것이라고 하던데요..
검증을 못해봤습니다.
자료를 찾아보니 4096바이트가 디폴드값이 라고 하는거 같기도 하구요
이 사이즈를 조절 하려면 어떻게 해야하는지 궁금합니다.
둘째,
만약 읽기가 아니라 쓰기라면 쓰고자하는 위치를 포함하는 섹터가
시스템 버퍼 상에 위치해야 하는데요
그렇다면 쓰는경우엔
파일 포인터 해당위치를 포함하는 섹터를 일단 시스템 버퍼로 불러온뒤에
그섹터 내용일부분에 저장을 하고나서 시스템 버퍼의 섹터내용을 디스크로
저장하게 되는것인가요?
예>
이러한 경우에요..
내부 알고리즘이 어떤식으로 되는지 궁금합니다.
두가지 답변부탁드립니다.
둘째질문에 대한 대답..
첫째는 잘 모르겟습니다.
둘째것만 아는대로 .......말해보겠습니다.
제가 아는대로 간략히 적어보면
이제 fopen 등의 파일을 여는 함수를 호출하면 open() 시스템 콜이 동작합니다.
아직까지는 커널이 디스크를 접근하지는 않았습니다.
파일에 쓰는 것이니깐
write() 시스템 콜이 호출됩니다.
캐쉬에 다 썼으면 struct file 의 file_position += 100 을 해줍니다.
참고로 아이노드 얘기는 하지 않았습니다.
너무 깁니다.
참고한 커널구조체는 이름은 정확하지만 멤버변수들의 이름은 다릅니다.
기억못하고 찾아보기는 귀찬고 해서리. .........^^
대신 그런의미의 변수들은 분명히 있습니다.
Bach라는 분의 유닉스 운영체제의 설계
Unix Operating System 을 읽어보시길..권해드립니다.
또 advanced unix programing 을 참조하시길.....스티븐스
.. 님께서 말씀하신 시스템버퍼가 디스크 캐쉬인것 같네요
흑 너무 길당.....
댓글 달기