안녕하세요 .. 생초보라..

huss5210의 이미지

안녕하세요 파일 처리 부분에 마음대로 되지 않아서 이렇게 질문 올립니다.

std::ifstream Fileio;
Fileio.open("Analysis.pdf",ios::in|ios::binary|ios::ate);
ofstream out("test.pdf",ios::out|ios::binary|ios::trunc);
ofstream outlog("test.log",ios::out|ios::binary|ios::trunc);

vector vecitemp;


int tempCount = 1;
int tempsize = 10000; //기본 블록 단위 크기
int templen = 0;
long tempcout;
long Nowcout=0;
long randnum = 0;
bool CheckRandValue = true;

Fileio.clear();
Fileio.seekg(0,ios::end); //커서 끝자리
tempcout = Fileio.tellg(); //총사이즈
Fileio.seekg(0,ios::beg); //다시 처음으로 커서 이동


templen = tempcout /tempsize;
char *tempchar = new char[tempsize];

//파일 사이즈
cout << "file size : " << tempcout << endl;
//파일 배분 사이즈
cout << "file len count : " << templen << endl;

tempCount = 1;


while( tempCount <=templen)
{
Fileio.read(tempchar,tempsize);
vecitemp.push_back(tempchar);
// out.write(tempchar,tempsize);

Nowcout = tempsize*tempCount;
tempCount++;
}

int sumcount = tempcout - Nowcout;

if(sumcount != 0)
{
Fileio.read(tempchar,sumcount);
vecitemp.push_back(tempchar);
//out.write(tempchar,sumcount);
}
std::copy(vecitemp.begin(), vecitemp.end(), ostream_iterator(out, ""));
cout << "ok" << endl;

out.flush();
out.close();

Fileio.close();

이렇게 처리 했을경우
char로 하면 해당 파일이 정상적으로 저장이 되는데..
string으로 했을경우 파일 용량이 축소 되어서 저장됩니다.ㅜㅜ;;

원본 파일 크기 104KB
저장했을경우에는 14kb 왜 이런 현상이 일어나는지 개념 자체가 없습니다.

너무 개념 없다 생각하신다면 사과드립니다. 이유를 찾지 못해서;;;

paranpi7의 이미지

char 배열과 string은 다른 개념이죠.
string은 라이브러리 마다 다르게 구현 되어있습니다.
sizeof(string) 을 했을경우 크기가 포인터 사이즈일 경우도 있고
32bit 플랫폼일경우 28byte 가 되는 경우도 있습니다.

보통 size , capacity , value , reference count 같은
필드를 가지고 있죠. 하지만 구현에 따라서
포인터가 위와같은 자료구조를 가지고 있을경우도 있고
vaule 값을 포인터로 가지고 있는경우도 있습니다.

위에서 vector에 string을 push 하셧다면
실제 읽어드린 데이터가 아닌 string 객체의 껍데기 만 저장 되겠지요.
{size , capacity.... 같은 값들.. , 혹은 포인터 값)
string aa라면.
실제 데이터인 aa.c_str()의 값들을 out으로 보내야하겠네요.

huss5210의 이미지

아 그런거 같습니다.
답변 진심으로 감사합니다.
그런데
out.write(vecitemp[i].c_str(),strlen(vecitemp[i].c_str())); 해도 ... 몇 바이트 문제가 발생합니다 ㅜㅜ;;

paranpi7의 이미지

out.write(tempchar,tempsize);
이렇게 하셧다면 당연히 차이가 있을수밖에 없겠네요.
tempsize = 10000 고정값이죠, 읽어들인 블럭의 값이 10000 이 아닌 파일의 끝에 도달해서 400바이트만 읽어들였어도
저장은 10000을 해버리겠네요, 그럼 400바이트 뒤에 600바이트는 힙영역에 할당된 쓰레기값
이 저장이 될듯 한데요,

out.write(tempchar,strlen(tempchar));
out.write(vecitemp[i].c_str(),strlen(vecitemp[i].c_str()));

이둘은 일치하지 않을까여?

huss5210의 이미지

그럼 어떻게 처리 하면 될까요 ㅜㅜ;;;

huss5210의 이미지

int ssxxx =0;
int sxf=0;
int tkc=0;

char rbuf[256] = {0x00, };

while( tempCount <=templen)
{
Fileio.seekg(Nowcout,ios::beg);
Fileio.read(tempchar,tempsize);

cout << "tempchar :" << strlen(tempchar) << endl;
cout << "tempsize :" << tempsize << endl;
cout << "Nowcout :" << Nowcout << endl;

ssxxx = tempsize - strlen(tempchar);

if (ssxxx != 0)
{
sxf = 0;
while( sxf < ssxxx)
{
strcat(tempchar,rbuf);
sxf++;
}
}
cout << "new tempchar :" << strlen(tempchar) << endl;
vecitemp.push_back(tempchar);

Nowcout = tempsize*tempCount;
tempCount++;
}

int sumcount = tempcout - Nowcout;

if(sumcount != 0)
{
cout << "Nowcout + sumcount :" << Nowcout+sumcount << endl;
Fileio.seekg(Nowcout,ios::beg);

Fileio.read(tempchar,sumcount);

vecitemp.push_back(tempchar);
//out.write(tempchar,sumcount);
}



if(!vecitemp.empty())
{
cout << "vecitemp count :" <

for(int i =0; i {
out.write(vecitemp[i].c_str(),strlen(vecitemp[i].c_str()));
tkc = tkc+strlen(vecitemp[i].c_str());

}
}

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.