NAVER

질문 파일구조.. C++ 대략 하는 방법좀..
StopStar 조회수 3,752 작성일2006.04.15

흪..어제부터 잡고 있는데 같은 부분만 뱅뱅 도네요..

일단 제가 하려는거는...

 

인풋파일이.. 물런..텍스트파일이구요..

대략 이런 내용이거든요..10개의 레코드가 있죠..``;.

+ 학번|이름|주소|도시|전화|0 학번|이름|주소|도시|전화|0

앞에 길이는 아스키코드로 표시된거구요..

이거를

학번|이름|주소|도시|전화|

학번|이름|주소|도시|전화|

학번|이름|주소|도시|전화|

학번|이름|주소|도시|전화|

..................

이런식으로 만드는거죠..

 

제가 이것 저것 알아봤는데..

 

첫번째...

 

#include <fstream.h>
#include <string.h>
#include "writeper.cpp"

istream & operator >> (istream & stream, Person & p){
 char delim;
 stream.getline(p.LastName,30,"|";
 if(strlen(p.Lastname)==0) return stream;
 stream.getline(p.FirstName,30,"|";
 stream.getline(p.Address,30,"|";
 stream.getline(p.City,30,"|";
 stream.getline(p.State,30,"|";
 stream.getline(p.ZipCode,30,"|";
 return stream;
}

void main(){

 char filename[120];
 Person p;
  
 cout << "Enter the filename :" << flush;
 cin.getline("input.txt", 19);
 ifstream file("input.txt", ios::in);
 if(file.fail()) {
  cout << "File open failed!" << endl;
  return 0;
 }
 while (1) {
  file >> p;
  if(strlen(p.LastName)==0) break;
  cout << p;
 }
}

 

이 소스는 책에서 참고한건데..

' | '로 구분된 파일을 갖는 person객체를 판독한다더군요..

그런데..실행을 하면..``;..3라인의 writeper.cpp  이놈을 찾지 못해서 실행조차 안되구요..

 

두번째...

int ReadVariablePerson(istream & stream, Person & p) {
 short length;
 stream.read(&length, sizeof(length));
 char * buffer = new char[length+1];
 stream.read(buffer, length);
 buffer[length] = 0;
 istream strbuff(buffer);
 strbuff >> p;
 return 1;
}

이 소스도 책에서 찾은건데.. 가변크기 Person 레코드를 판독하는 함수라는군요..

그래서 제가 하는 것도 가변길이 같아서 이것도 적용해 보려했는데..

여기 저기에다 너봐도 엄청난 오류들만 발생한다는...

 

세번째...

#include <fstream.h>
void main(){

 char ch;
 fstream file;
 char filename[120];
 cout << "Enter the name of the file :"
  << flush;
  cin >> filename;
 file.open("input.txt", ios::in);
 file.unsetf(ios::skipws);
 while(1){
  file >> ch;
  if(file.fail()) break;
  cout << ch;
 }
 file.close();
}

 

이거는.. 그냥.. 제가 구하는 택스트 파일을 출력하는 소슨데..이건 되긴되는데..

대략 이거를 실행하면 결과가..

+ 학번|이름|주소|도시|전화|0 학번|이름|주소|도시|전화|0 ............

그냥..텍스트 파일 자체가 출력되죠..``;.. 그래서 어케 변형해서.. 결과값과 비슷하게

마추려해도 안되네요..``;.. 나중엔 이걸로 출력은 해야되는지..``;..

 

그밖에도 책에 관련된거 같은 소스들을 이것 저것 해봐도 해결책이 없네요..``;.

 

제가 대략 어는 방법으로 해야 결과를 얻을수 잇을까요..

답을 적어 달라는 것은 아니구요..

 

이런식의 문제의 해결방법은.. 이렇다..이런식의 조언좀 부탁드립니다..

어떤어떤 함수를 써야하는지..

그리고 관련된 소스가 있으시면.. 설명도 주신다면..정말 ㄳ하겠습니다.

 

흪..C++ 넘 어렵네요..``;.. 에휴..

프로필 사진

답변자님,

정보를 공유해 주세요.

1 개 답변
1번째 답변
프로필 사진
탈퇴한 사용자 답변

/*

레코드의 길이를 몰라도( 다양하더라도) 필드(멤버)들이 분리자  '|'로  분리되고  

계층의 필드수(5개)를 알고 있으므로 정확하게 레코드를 읽을 수가 있습니다.


input.txt의 내용이
레코드별로 구분되지 아니한 상태로 아래처럼 저장되어 있을 때
이것을 읽어서 화일과 화면에 출력해보았습니다.

참고해보시기를 바랍니다.

 

12343|박병재|서초동 12305번지|서울|023-900-6484|89078|전공찬|수성동 345-8번지|대구|042-923-2424|78912|임택근|한라동 777번지5통2반|대여|012-789-6009|59290|이성실|공성동 890-777번지|옥천|044-762-8912|30082|최수용|삼척동 888-007번지|강릉|090-777-8888|
*/

 

// 레코드의 필드명을 참고로하여 Person이라는 계층을  아래와 같이 정의해봅니다. 

// Person이라는 계층

 

#include <iostream>
#include <fstream>

 

using namespace std;

 

class Person
{

     // 아래배열의 크기는 읽어들일 화일의 어느 레코드의 필드 길이라도   

     // 이와 대응되는 필드(멤버)의 배열 크기보다 크지 않다는 조건이 따름니다.

     // 즉 아래 필드들의 배열 크기는 충분한 여유의 사이즈로 선언되어어야합니다. 

    char num[16];
    char name[16];
    char addrs[64];
    char city[16];
    char phno[20];

 

 public:
       Person()
       {
          strcpy( num, "" );
          strcpy( name, "" );
          strcpy( addrs, "" );
          strcpy( city, "" );
          strcpy( phno, "" );
      }

 

      //  주어진 is 라는 입력스트림으로 부터 레코트의 필드들을 읽는 함수  

      friend istream& operator >> ( istream& is, Person& p )
      {
         //  '|'문자로 구별된 레코드의 필드들을 읽습니다
         //  getline 함수는 분리문자가 개행 문자 '\n'인 경우에는 함수의 이름이 어울리지만 
         //  분리문자가 다른경우에는 getline이라는 이름이 어울리지 아니하므로

         //  혼동이 될수 있습니다.
         //  이 경우에는 라인을 읽는 것이 아니라 '|'로 구분되는 필드를 읽게됩니다.
         is.getline( p.num, 16, '|' );
         is.getline( p.name, 16, '|' );
         is.getline( p.addrs, 64, '|' );
         is.getline( p.city, 16, '|' );
         is.getline( p.phno, 20, '|' );

         return is;
      }

 

      //  주어진 os 라는 출력스트림에 출력하는 함수  

      friend ostream& operator << ( ostream& os, const Person& p )
      {
           os << p.num << "|" << p.name << "|" << p.addrs << "|" << p.city << "|" << p.phno << "|" << endl;
         return os;
      }
};

 

int main( void )
{
    int i;

   // 화일에 최대 10명정도의 레코드가 저장되어 있다고 가정하여 이것들을 

   // 읽어서 저장할 배열을 선언합니다. 

   // 간단히 읽고 쓰기만 하려면 하나의 객체를 선언하여 사용해도 무방합니다.

   // 그러나 레코드들로부터 검색, 수정등의 작업을 하려한다면  배열로 선언합니다.

   Person p[10];

 

   // 입력화일이 input.txt인 경우

   ifstream ifs( "input.txt" );

 

   // 라인단위로 레코드들을 저장할 화일
   ofstream ofs( "output.txt" );

 

   //  레코드를 배열로 읽어들이고 결과를 화면과 화일에 출력해봅니다.

   // >>와 << 는 계층에서 정의된 friend 함수 operaor >> 와 operator << 연산입니다.

   while( ifs >> p[i] && ofs )
   {
       cout << p[i];
       ofs << p[i++];
   }

 

   cout << endl << i << "개의 레코드를 읽고 출력했습니다." << endl;


   ifs.close();
   ofs.close();


   return 0;
}

 

/*

// 실행결과

*/

2006.04.15.

  • 채택

    질문자가 채택한 답변입니다.

도움이 되었다면 UP 눌러주세요!
UP이 많은 답변일수록 사용자들에게 더 많이 노출됩니다.