시스템 콜을 사용해 fwrite를 구현하려고 합니다.

atomes의 이미지

fwrite 함수를 시스템콜을 사용해서 구현하려고 합니다.

임시버퍼의 크기를 64,파일버퍼의 크기를 1000이라고 선언하면

1) 파일에 저장할 배열의 원소를 임시버퍼 크기만큼(0~63) 가져와 임시버퍼에 넣는다
2) 임시버퍼가 꽉 차면 파일버퍼에 임시버퍼의 내용을 쓰고 임시버퍼를 비운다
3) 1)의 배열의 다음 위치부터 시작해서 원소를 임시버퍼 크기만큼(64~127) 가져와 임시버퍼에 넣는다
4) 임시버퍼가 꽉 차면 파일버퍼에 임시버퍼의 내용을 이어서 쓰고 다시 임시버퍼를 버퍼를 비운다
5) 위와 같은 과정을 반복해서 배열의 모든 원소가 파일버퍼에 들어가거나 파일버퍼가 꽉 차면
write함수를 이용해 파일에 파일버퍼의 내용을 쓴다

임의로 만든 파일 구조체 _FILE은 다음과 같습니다.

typedef struct __FILE {
 
int fd; //파일식별자
char* pBuf; //파일의 버퍼
int allocBytes; //기록할 자료의 양
} _FILE;

다음은 구현하려는 _fwrite 입니다.

#typedef MAX_BUF_SIZE 64
#typedef FILE_BUF_SIZE 1000
 
size_t _fwrite( void *ptr, size_t size, size_t nitems, _FILE *stream)
{
   int writereturn = 0;
   int i = 0;
   int j = 0;
   int k = 0;
   char buf[MAX_BUF_SIZE];
   while(ptr[j]!='\0')
   {
      while(i != MAX_BUF_SIZE-1)
      {
         buf[i] = (char*)ptr[j];
         i++;
         j++;
      }
      i = 0;
      while(k != j)
      {
         stream->pBuf[k] = buf[i];
         i++;
         k++;
      }
   }
  writereturn = write(fd, stream->pBuf, nmemb);
  return writereturn;
 
}

컴파일시 오류가 나는데 void 포인터가 문제인 것 같습니다.
void 포인터의 어떤 부분에서 틀린건지 잘 모르겠네요.. 도통 감을 못잡겠습니다.
고쳐야 할 부분 지적해주시면 감사하겠습니다
익명 사용자의 이미지

error message 를 함께 찍어주시면 더 좋을텐데요.. ㅎㅎ

atomes의 이미지

감사합니다
void포인터는 어떠한 타입이여도 상관없다는 소리를 들어서
일부러 캐스팅하지 않았는데 역시 캐스팅이 필요한가 보네요;;

익명 사용자의 이미지

while(ptr[j]!='\0')

부분에서 ptr은 type이 void*이니 ptr[i]로 접근할 수 없을 것 같네요 ㅎ

wsong의 이미지

보이드 포인터 접근하실 때 이런식으로 접근하시면 문제 없을 꺼 같습니다.
((char *)void_ptr)[i]

(char *)void_ptr[i] // 이렇게 하면, 우측 결합이 우선시 되기 대문에 void *로 연산하게 됩니다.

댓글 달기

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