fwrite 사용이 틀린건지..C++ 빌더 사용중 질문드립니다.ㅠ 완전 초짜에요!

Sky_pneuma의 이미지


void __fastcall TForm1::Button2Click(TObject *Sender)
{
short dataSize = 300000;
short btSize = 1024;

AnsiString fileName = "E:\\SUVAData\\111(NORTH)_CH1.NSWD";

double buffer[] = {dataSize*btSize};

FILE *Open;

if((Open = fopen(fileName.c_str(), "rb")) == NULL)
ShowMessage("Can't not open file");

else
{
if(fseek(Open, SEEK_SET, 0) == 0)
{
fread(buffer, sizeof(short), dataSize*btSize, Open);

FILE *outTextFile = fopen("d:\\Header.txt", "ab");

fwrite(buffer, 2, dataSize, outTextFile);

fclose(outTextFile);
fclose(Open);
}
else
{
ShowMessage("fseek function failed.");
}

}

delete [] buffer;
}

소스는 이러합니다. 데이터 파일을 읽어와서 300KB 에 해당하는 데이터만 분할해서 저장하는 소스인데요. 파일 생성은 되지만 내용이 들어오질 않아요 ㅠ

약간씩 고쳐보면 내용이 글자가 깨져서 나오구요. 위에 소스대로하면 파일만 생성되고 안은 텅 비어있네요 -_-;;

어디가 잘못된건지 모르겠습니다ㅠ fwrite 말고 fprintf로 해야할까요? 사수께서 만든 소스로보면 fprintf 로 반복적으로 한 라인씩 읽어서 출력하게 하셨던데..

암 것도 모르는 초짜의 생각으론 한 꺼번에 읽어서 한 번에 쓰는게 빠르고 낫지 않을까...싶어서요.

그리고 한 가지 더 조언부탁드리자면 위에 파일을 읽어오는 부분에서, 사용자가 원하는 파일을 선택하게 하는 방법을 알고 싶습니다!!

부탁드립니다 이 땅의 수많은 프로그래머 여러분 ㅠㅎ 프로그래밍 공부 재밌는데...개발자 되고 싶어서 일하는 중인데...한 줄 작성도 어렵네요 ㅠ

qiiiiiiiip의 이미지


꼭 이질문에만 해당되는 답변은 아닙니다만, 문득 생각나서 답변겸 적어봅니다.

질문자분께서는 충분히 삽질해보고 안되고, 절박해서 질문 올리는 경우가 많은데요,
그런경우에도 올라온 소스를 보면 작업하던 코드를 그대로 일부 copy-paste해서 올립니다.

그럼 답을 하려는 사람이 보면 별로 불필요한 코드도 섞여있어서 보기도 나쁘고,
오류를 재현하기도 불가능합니다.

이 경우처럼 fwrite, fprintf가 의심되는 부분이면,
별도로 main 함수 하나짜셔서, 해당되는 기능만 수행하도록 해서,
확인해보고, 안되면 그 코드 전체를 올리고, 입력파일도 간단한걸로 같이 올리면,

일단 답글을 달아볼까 라고 생각하는 사람이 많아지고, 그 중에 정답이 빠르게 올라오게 되죠.

그런데, 그전에 그런 작업 ( 의심되는 부분만 빼서 minimal code를 만드는 작업 )을 하다보면,
대부분의 경우 스스로 답을 찾게 됩니다..
그러면서 본인도 발전하게 되는 거고요..

그런데 보통들은 그런작업을 안하더라고요. 귀찮다는게 가장 큰 이유일듯..

--

질문하신 내용은 fwrite로 short를 쓰게 되면, 파일에는 원래 숫자와는 전혀 다른 데이터가 저장됩니다.
예를 들어 short i = 0을 fwrite로 저장하면,
2byte짜리 0x00 0x00 이 기록되어있는 binary데이터가 만들어지겠죠.

fprintf로 저장하면 텍스트 0이 기록되어있는 텍스트 파일이 만들어집니다.
'0'의 ascii 코드가 1byte int(char) 형태로 저장되어있는 파일이겠지요. 어쩌면 '\r\n', 의 ascii코드도 포함하여
1byte혹은 2byte혹은 3byte 짜리 파일이 만들어집니다.

Sky_pneuma의 이미지

음..위에 적으신 내용은, 오해하실까봐 말씀드리는거지만, 빌더로 작성중인 코드인데요, 이 부분이 메인이라고 해도 마찬가지입니다.
빌더로 2개의 버튼을 만들어서 작성한건데, 첫 번째 버튼은 제 사수분께서 만들고 설명해준 부분이라서 잘 돌아갑니다 ㅎ
제가 올린 부분의 소스는 제가 작성하고 있는거라 올린거구요. 저부분만 따로 빼내서 만드는 것과 마찬가지라서 그대로 올린겁니다ㅎ
불필요한 부분은...지금 제 수준에선 어디가 불필요하고 더 깔끔하게 할 수 있는지조차 구분할게 못되는 먼지와 같은 상태인지라 ㅠ
제가 작성한 원형 그대로 올린거구요 ㅠㅎ 다소 보기 불편하셨더라도 이제 시작하는 사람이니까 그렇구나~라고 이해해주시면 감사하겠습니다 ^^;;

---------------------------------------------

말씀해주신 부분을 계속 고쳐보는 중입니다. 오늘 안에는...해결할 수 있겠죠 ㅠ ㅎ

프로그래밍 옹알이 시작중.

klara의 이미지

어디가 잘못된건지에 대해서는 qiiiiiiiip님의 답변을 참고하시면 될듯합니다. 한가지 첨언하자면,

>> 암 것도 모르는 초짜의 생각으론 한 꺼번에 읽어서 한 번에 쓰는게 빠르고 낫지 않을까...싶어서요.
이 부분에 대해서 답변하자면, 어차피 fprintf던 frwite던 C의 표준 입출력 함수들은 모두 버퍼링을 합니다. 따라서 여러번에 나눠쓰던 한번에 길게 쓰던 명시적으로 fflush가 호출되지 않는한 버퍼에 모았다가 한번에 출력합니다. 따라서 쪼개쓰느냐 한번에 쓰느냐의 성능차이는 미미합니다. 그냥 쓰기 편한쪽, 보기 좋은쪽으로 하시면 됩니다.

Sky_pneuma의 이미지

buffer에 할당되니까 그게 그거인 거군요..네 감사합니다 하나 더 알게 됐네요 ^^

프로그래밍 옹알이 시작중.

라스코니의 이미지

사견을 말씀드리자면,,

short dataSize = 300000;
short btSize = 1024;
 
double buffer[] = {dataSize*btSize};

이 부분이 틀렸습니다. buffer[] 는 단순히 300000 * 1024 라는 값을 가지고 있는 double 형 원소를 하나 가지고 있는 배열일뿐입니다.

어디에도 buffer에 Header.txt 안에 있는 내용을 보관할 수 있다는 보장이 없습니다. 프로그램이 돌면서 크래쉬 안난게 이상하네요.

그리고 동적생성도 안했는데 buffer를 delete 로 지울수는 없습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.