[질문]C++ ifstream을 이용해서... fseek ftell 을 하고 싶은데.

kimdy123의 이미지

#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을 할때 어떤 함수를 이용해야 현재 라인을 구할수 있고
어떤 함수를 써야 파일의 원하는 곳에 갈수 있나요.
읽어주셔셔 감사 드림니다.
그럼 좋은 하루 되세요.

cedar의 이미지

소스 코드를 올리실 때는 보기 편하도록 꼭 BBCode를 써서 올려주세요!! :x

kimdy123 wrote:

#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을 할때 어떤 함수를 이용해야 현재 라인을 구할수 있고
어떤 함수를 써야 파일의 원하는 곳에 갈수 있나요.

stdio.h의 ftell과 fseek에 해당하는 ifstream의 멤버 함수는
tellg와 seekg가 있습니다.
그런데 님의 코드를 보니 굳이 vector와 랜덤 액세스를 사용하기 보다는,
연관 컨테이너인 map 컨테이너만 있으면 간단하게 순차 액세스로 끝낼 수 있습니다.

대강의 사용법을 설명하자면 다음과 같습니다.
먼저

typedef map<int, string> CellMap;
CellMap cell;

과 같이 선언합니다. 굳이 별도로 클래스를 정의할 필요도 없지요.
검색할 때는
cell[line_number] = cellname;
와 같이 합니다. 즉 map은 일종의 희소 배열(sparse array)라고 보시면 됩니다.
삽입도 위의 형식으로 가능하지만,
성능을 위해서는
cell.insert(CellMap::value_type(line_number, cellname));
로 하는 것이 좋습니다.
결과를 출력할 때는
for (CellMap::iterator i = cell.begin(); i != cell.end(); ++i)
    cout << "[" << i->first << "]"  << i->second << endl;

와 같은 형식을 쓰면 되죠.
purewell의 이미지

http://cplusplus.com/ref/iostream/fstream/

fstream은 ifstream과 ofstream을 상속 받습니다.

ifstream에는 tellg, seekg가,

ofstream에는 tellp, seekp가 존재합니다.

tellg, seekg를 쓰면 읽어야할 포인터 위치 정보를 액세스 할 수 있으며,

tellp, seekp를 쓰면 쓸 포인터 위치 정보를 액세스 할 수 있습니다.

자세한 레퍼런스는 위의 웹페이지에서 샤바샤바 하시길...

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

pynoos의 이미지

사족입니다만... :D

g : get
p : put

의 의미를 지니고 있지요.

purewell의 이미지

사족의 사족이지만...

pynoos님...

:lol: 아이콘으로 쓰시는 아기 얼굴이 너무 예뻐요!!

따님이신가요?

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

pynoos의 이미지

네 딸입니다. 지민이지요^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.