[질문]C++ ifstream을 이용해서... fseek ftell 을 하고 싶은데.
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
typedef struct cell{
int line_number;
string cellname;
} CELL;
class vcomp{
public:
bool operator()( const CELL& F, const CELL& S) const
{
return F.cellname < S.cellname;
}
};
int main( int argc, char *argv[] ){
int i=0;
int s=0,e=0;
vector<CELL> cellname;
string ch;
string line;
string cell;
ifstream fin( "/home/user/SDW/MAIN/log" );
if( fin.is_open() ){
while( getline( fin,line)){
if( line.substr(0,8) == string("CELLNAME") ){
s=line.find("[");
e=line.find("]");
cell=line.substr(s+1,e-s-1);
CELL cell;
cell.cellname=line.substr(s+1,e-s-1);
cell.line_number=i;
cellname.push_back( cell );
//여기다 ftell(fin) 이런식으로 해서 cell.line_number에 저장할라고 하구요.
}
i++;
}
}else{
cout << "Can't open file![/home/user/SDW/MAIN/log]." << endl;
}
sort( cellname.begin(), cellname.end(), vcomp() );
for( int j=0; j < cellname.size(); j++){
// 여기서 line_number가지고 fseek( fin, line_number,0) 이렇게 하고 싶어요.
cout << "[" << cellname[j].line_number << "]" << cellname[j].cellname << endl;
}
return 1;
}
위에서 ifstream을 할때 어떤 함수를 이용해야 현재 라인을 구할수 있고
어떤 함수를 써야 파일의 원하는 곳에 갈수 있나요.
읽어주셔셔 감사 드림니다.
그럼 좋은 하루 되세요.
Re: [질문]C++ ifstream을 이용해서... fseek ftell 을 하고 싶?
소스 코드를 올리실 때는 보기 편하도록 꼭 BBCode를 써서 올려주세요!! :x
stdio.h의 ftell과 fseek에 해당하는 ifstream의 멤버 함수는
tellg와 seekg가 있습니다.
그런데 님의 코드를 보니 굳이 vector와 랜덤 액세스를 사용하기 보다는,
연관 컨테이너인 map 컨테이너만 있으면 간단하게 순차 액세스로 끝낼 수 있습니다.
대강의 사용법을 설명하자면 다음과 같습니다.
먼저
과 같이 선언합니다. 굳이 별도로 클래스를 정의할 필요도 없지요.
검색할 때는
cell[line_number] = cellname;
와 같이 합니다. 즉 map은 일종의 희소 배열(sparse array)라고 보시면 됩니다.
삽입도 위의 형식으로 가능하지만,
성능을 위해서는
cell.insert(CellMap::value_type(line_number, cellname));
로 하는 것이 좋습니다.
결과를 출력할 때는
와 같은 형식을 쓰면 되죠.
tellg, seekg, tellp, seekp
http://cplusplus.com/ref/iostream/fstream/
fstream은 ifstream과 ofstream을 상속 받습니다.
ifstream에는 tellg, seekg가,
ofstream에는 tellp, seekp가 존재합니다.
tellg, seekg를 쓰면 읽어야할 포인터 위치 정보를 액세스 할 수 있으며,
tellp, seekp를 쓰면 쓸 포인터 위치 정보를 액세스 할 수 있습니다.
자세한 레퍼런스는 위의 웹페이지에서 샤바샤바 하시길...
_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz
사족입니다만... :D g : getp : put의
사족입니다만... :D
g : get
p : put
의 의미를 지니고 있지요.
---
http://coolengineer.com
사족의 사족이지만...
사족의 사족이지만...
pynoos님...
:lol: 아이콘으로 쓰시는 아기 얼굴이 너무 예뻐요!!
따님이신가요?
_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz
네 딸입니다. 지민이지요^^
네 딸입니다. 지민이지요^^
---
http://coolengineer.com
댓글 달기