Q&A

  • 다음에 C언어를 DELPHI로 변환이 가능할까요?
사람정보들을 델파이로 화일읽고 쓰기를 하는데
데이타(사람정보)가 구분자없이 한줄로만 되어 있어서 size정보만가지고 잘라서
사람별로 줄을 만들려고 합니다.
readln으로 읽어와서 루프를 돌면서 copy로 자르기를 해보니
데이타길이가 너무길어서 반나절이상이 걸리더군요
그래서 C로 구현된걸 이용해보려고 시도하고 있습니다.
한사람에 정보가
고정길이(4개 buf변수로) 56+101+441+4 이고
가변길이(1개 buf변수로)는 고정길이 마지막 4size에 가변길이 size정보를 가지고 있습니다.
보시면 아시겠지만 사이즈만큼만 버퍼로 읽어서 바로 쓰기를 루프돌리고
있습니다.
현재 필요한정보는 buf1,buf3만 필요로한 로직을 c로 구현되어 있습니다.
보시고 가능한지, 가능하다면 어떤식으로 처리해야될지를 가르침을 받고
싶습니다. 읽어주셔서 감사합니다.

#include <stdio.h>
#include <fcntl.h>
#include <ctype.h>
#include <stdlib.h>
#include <mem.h>

#define BUFSIZE1 56
#define BUFSIZE1 101
#define BUFSIZE1 441
#define BUFSIZE1 4
#define BUFSIZE1 50000
FILE *in,*out1;

main(int argc,char *argv[])
{
  char buf1[BUFSIZE1];
  char buf2[BUFSIZE2];
  char buf3[BUFSIZE3];
  char buf4[BUFSIZE4];
  char buf5[BUFSIZE5];

  int i = 0;
  int ibuffer4 = 0;
  int max_size = 0;
  /* FILENAME INPUT */ -- 파일명 입력체크
  if(argc < 2) {
    fprintf(stdout,"t Please.. Input File Name n");
    return(1);
  }
  /* READ FILE OPEN */ -- 읽을파일명 열기체크
  if((in = fopen(argv[1],"r")) == NULL) {
    fprintf(stdout,"t %s File Read Error n",argv[1]);
    return(1);
  }
  /* WRITE FILE CREATE */ -- 쓰기파일명 생성체크
  if((out1 = fopen("outfile1.txt","w")) == NULL) {
    fprintf(stdout,"t Create outfile1.txt File Error n");
    return(1);
  }
  /* FILE READ AND FILE WRITE */ -- 파일 읽고 쓰기 루프 시작
  while(!feof(in))
  {
    /* VARIABLE INIT */ -- 변수 초기화
    memset(buf1,'',BUFSIZE1);
    memset(buf2,'',BUFSIZE2);
    memset(buf3,'',BUFSIZE3);
    memset(buf4,'',BUFSIZE4);
    memset(buf5,'',BUFSIZE5);
    /* READ BUF1 & FILE EMPTY OR EOF CHECK */ -- buf1 읽고 NULL 또는 EOF체크
    if(fread(buf1,BUFSIZE1,1,in)==0){
      fclose(in);
      return(0);
    }
    else{
      /* READ BUF2 */ -- buf2 읽기
      fread(buf2,BUFSIZE2,1,in);
      /* BUF3 DIVIDE */ -- buf3 읽고 나누기 루프
      for(i=1;i<=10;i++)
      {
        memset(buf3,'',BUFSIZE3);
        /* WRITE BUF1,INC */ -- buf1과 순번 쓰기
        fprintf(out1,"%-56.56s",buf1);
        fprintf(out1,"%-4.4d",i);
        /* READ,WRITE BUF3 */ -- buf3과 읽고 쓰기
        fread(buf3,BUFSIZE3,1,in);
        fprint(out1,"%-441.441sn",buf3);
      }
      /* READ BUF4 */ -- buf4과 읽기
      fread(buf4,BUFSIZE4,1,in);
      /* BUF5 SIZE CALCULATION */ -- buf4정보로 buf5 읽을 버퍼사이즈 계산
      ibuffer4 = atoi(buf4);
      max_size = !buffer4 * 441;
      /* READ BUF5 */ -- buf5과 읽기
      fread(buf5,max_size,1,in);
    } /* end else */
  } /* end while (end of file) */
  fclose(in);
  fclose(out1);
  return(0);
} /* end main */
  
2  COMMENTS
  • Profile
    바보감자 2003.06.25 02:57
    안녕하세요 언제나 초보 바보감자입니다.
    소스를 보니..
    제가 게임맹글때 bmp로드하는거와 비슷하더군요..
    델파이에서도 같은 함수가있습니다.
    FileRead <-- 사용해보세요..

    procedure TForm1.Button1Click(Sender: TObject);

    var
      iFileHandle: Integer;
      iFileLength: Integer;
      iBytesRead: Integer;
      Buffer: PChar;
      i: Integer
    begin
      if OpenDialog1.Execute then
      begin
        try
          iFileHandle := FileOpen(OpenDialog1.FileName, fmOpenRead);
          iFileLength := FileSeek(iFileHandle,0,2);
          FileSeek(iFileHandle,0,0);
          Buffer := PChar(AllocMem(iFileLength + 1));
          iBytesRead := FileRead(iFileHandle, Buffer, iFileLength);
          FileClose(iFileHandle);

          for i := 0 to iBytesRead-1 do
          begin
            StringGrid1.RowCount := StringGrid1.RowCount + 1;
            StringGrid1.Cells[1,i+1] := Buffer[i];
            StringGrid1.Cells[2,i+1] := IntToStr(Integer(Buffer[i]));
          end;
        finally
          FreeMem(Buffer);
        end;
      end;
    end;


    이소스가 기본 적인거구요..
    변경을 하셔야겠지요. 쓰실려면 ^^
    즐푸하세요.. 꾸벅..

  • Profile
    성준 2003.06.25 07:39
    제가 원하던 답이네요.
    아직 테스트는 안해봤지만 될 거 같군요
    거듭 감사합니다.