fwrite 질문있습니다.

익명 사용자의 이미지

예를 들어 버퍼사이즈가 1024일 경우, fwrite로 총 2000바이트를 파일에 작성한다고 할 때 1024바이트가 우선 써지고 나머지 976바이트는 버퍼에 저장되어 있다가 후에 버퍼가 찼을 때 써지는 것 아닌가요??

지금 파일 io들을 재정의해보고 있는데 제가 구현한 fwrite는 위의 방식처럼 작동하는데 라이브러리의 fwrite은 2000바이트를 파일에 작성합니다. glibc를 보고 구현해보긴 했는데 아직 완벽히 해석할 정도의 실력이 되지 않아 위의 처리 과정이 잘 이해가 되지 않습니다. 알려주시면 감사드리겠습니다.

kurishin의 이미지

fwrite 함수는 실제 write된 값이 리턴됩니다. 2000 바이트에서 리턴값을 뺀 후 0이 아니라면 다시 이후 값을 fwrite 하여야 합니다.

chanik의 이미지

Ubuntu 20.04에서 fwrite() 테스트해보니 버퍼크기가 4KB인지 4KB 쓰기 전까지는 실제로 파일에 쓰기가 이뤄지지 않았고 4KB 넘어가면 딱 4KB를 쓰네요. 이후 추가로 4KB 채워지기 전까지는 파일 쓰기가 미뤄지다가 4KB 넘어가면 다시 딱 4KB 쓰고요. 물론 fflush()를 넣으면 그 때까지 버퍼에 쌓인 데이터가 고스란히 쓰기가 이뤄졌습니다.

제 시스템에서는 문서대로 행동하는 것 같은데, 지금 테스트하시는 시스템에서는 그렇지 않은지요? 사용하신 방법이나 샘플을 올려보시면 어떤가요?

저는 아래와 같이 해봤습니다. 4500바이트 fwrite()하고 프로그램이 입력대기하는 상태에서 파일크기 ls 해보고, 프로그램 종료뒤 다시 ls 해보는 식인데, 중간에는 test.txt 크기가 4096으로 나오고 종료뒤엔 4500으로 나오는 걸 보고 위와 같이 해석한 것입니다. 쓰기량을 늘리면 같은 일이 4KB 단위로 발생했고요.

$ cat fwrite.c
#include <stdio.h>
 
int main( )
{
    FILE *pFile = fopen( "test.txt", "w+t" );
    char buffer[] = "Hello, World!\n";
 
    for (int i=0; i<300; i++)
        fwrite( buffer, sizeof(char), sizeof(buffer), pFile );
 
    int i;
    scanf("%d", &i);
 
    fclose( pFile );
 
    return 0;
}
 
$ gcc -o frwite fwrite
$ ./fwrite &
[1] 162148
$
 
[1]+  Stopped                 ./fwrite
$ ls -l test.txt
-rw-rw-r--  1 tester tester  4096 Jun  4 20:08 test.txt
$ fg
./fwrite
1
$ ls -l test.txt
-rw-rw-r--  1 tester tester  4500 Jun  4 20:09 test.txt
익명 사용자의 이미지

질문이 달린 지 열흘 넘게 지났는데 아직도 setvbuf 함수를 알려 주는 답변이 없다니요.

그럼 내가 해야지:

https://en.cppreference.com/w/c/io/setvbuf

댓글 달기

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